Oracle для профессионалов




Передача данных - часть 8


IN, - Java-метод не сможет определить, что значение не нужно читать, поскольку неопределенные значения не поддерживаются.

164 165 public static void pass_int(int p_in, int[] p_out) 166 { 167 System.out.println 168 ("Входной параметр " + p_in); 169 170 p_out[0] = p_in; 171 172 System.out.println 173 ("Выходной параметр " + p_out[0]); 174 }

Наконец, перейдем к функциям. Если помните, на языке C написать их было непросто. Необходимо было выделять память, обрабатывать неопределенные значения, явно преобразовывать типы данных C в типы данных Oracle и т.д. Каждая C-функция при этом состояла как минимум из десятка строк кода. В случае же Java достаточно добавить оператор return:

175 176 public static String return_string() 177 { 178 return "Hello World"; 179 } 180 181 public static java.sql.Timestamp return_date() 182 { 183 return new java.sql.Timestamp(0); 184 } 185 186 public static java.math.BigDecimal return_num() 187 { 188 return new java.math.BigDecimal("44.3543"); 189 } 190 191 } 192 /

Java created

tkyte@TKYTE816> set define on

Запрограммировать функцию на Java гораздо проще, чем на языке C, благодаря тому, что Java выполняет много действий автоматически, "за кадром". Для обеспечения аналогичной функциональности на языке C потребовалось около 1000 строк кода. Выделение памяти, которое требует столько внимания при программировании на C, в случае Java — не проблема. В случае ошибки возбуждается исключительная ситуация. Индикаторные переменные, с которыми надо было возиться в языке C, вообще не нужны в Java. Проблема возникает при передаче типов данных, соответствующих не объектным типам Java, но, как я уже говорил, не следует их использовать, если может потребоваться передать неопределенные значения.

Поскольку все компоненты созданы, можно вызывать подпрограммы. Например:

tkyte@TKYTE816> set serveroutput on size 1000000 tkyte@TKYTE816> exec dbms_java.set_output(1000000)

tkyte@TKYTE816> declare 2 l_in strArray := strArray(); 3 l_out strArray := strArray(); 4 begin 5 for i in 1 .. 5 loop 6 l_in.extend; 7 l_in(i) := 'Элемент ' i; 8 end loop; 9 10 demo_passing_pkg.pass(l_in, l_out); 11 for i in 1 .. l_out.count loop 12 dbms_output.put_line('l_out(' i ') = ' l_out(i)); 13 end loop; 14 end; 15 / Тип массива SECOND.STRARRAY Код типа массива 12 Длина массива 5 p_in[0] = Элемент 1 p_in[1] = Элемент 2 p_in[2] = Элемент 3 p_in[3] = Элемент 4 p_in[4] = Элемент 5 l_out(1) = Элемент 1 l_out(2) = Элемент 2 l_out(3) = Элемент 3 l_out(4) = Элемент 4 l_out(5) = Элемент 5

PL/SQL procedure successfully completed.

Первые восемь строк результата были сгенерированы Java-методом, а последние пять — PL/SQL-кодом. Значит, мы передали массив из PL/SQL в Java и получили его обратно. С помощью Java-метода мы скопировали входной массив в выходной после распечатки метаданных и значений элементов массива.




Содержание  Назад  Вперед