|
Программирование >> Oracle
Хранимые процедуры на языке Java 1373 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 134 135 136 137 138 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 156 157 Connection conn = new OracleDriver().defaultConnectionO; ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor(p in.getSQLTypeNatne(), conn) ; p out[0 ] new ARRAY(descriptor, conn, values); public static void pass date array(oracle.sql.ARRAY p in, oracle.sql.ARRAY[] p out) throws SQLException show array info(p in); java.sql.Timestamp[] values (Timestamp[])p in.getArray(); for(int i = 0; i < p in.length(); System.out.println( p in[ +i+ ] = + values[i].toString()); Connection conn = new OracleDriver().defaultConnection(); ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor (p in.getSQLTypeName(), conn) ; p out[0] = new ARRAY(descriptor, conn, values); public static void pass str array(oracle.sql.ARRAY p in, oracle.sql.ARRAY[] p out) throws java.sql.SQLException,IOException show array infо(p in); String[] values = (String[])p in.getArray(); for(int i = 0; i < p in.length(); System.out.println( p in[ +i+ ] = + values[i]); Connection conn = new OracleDriver().defaultConnection(); ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor(p in.getSQLTypeName(), conn) ; p out[0] = new ARRAY(descriptor, conn, values); Передача данных типа RAW ничем не отличается от передачи строк. С этим типом данных работать очень легко: 159 public static void pass(byte[] 160 { p in, byte[][] p out) 1374 Глава 19 161 if (p in != null) 162 p out[0] = p in; 163 J Передача цел1х чисел - проблематична, я вообще не рекомендую их передавать. Нет способа передать значение NULL - соответствующий тип данных int относится к базовым типам данных языка Java. Эти данные не являются объектами и поэтому не могут быть пустыми. Поскольку индикаторные переменные не поддерживаются, то при необходимости обработать пустые значения придется передавать отдельный параметр, а в PL/SQL-коде - проверять соответствующий флаг, чтобы определить, не возвращено ли пустое значение. Соответствующий метод представлен здесь для полноты, но лучше вообще не использовать данные целого типа, особенно как параметры, передаваемые в режиме IN, - Java-метод не сможет определить, что значение не нужно читать, поскольку пустые значения не поддерживаются. 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 J Наконец, перейдем к функциям. Если помните, на языке С написать их б1ло непросто. Необходимо было выделять память, обрабатывать пустые значения, явно преобразовывать типы данных С в типы данных Oracle и т.д. Каждая С-функция при этом состояла как минимум из десятка строк кода. В случае же Java достаточно добавить оператор return: 176 public static String return string() 177 { 178 return Hello World ; 179 J 181 public static java.sql.Timestamp return date() 182 { 183 return new java.sql.Timestamp(0); 184 J 186 public static java.math.BigDecimal return num() 187 { 188 return new java.math.BigDecimal( 44.3543 ); 189 J 191 J 192 / Хранимые процедуры на языке Java 1375 Java created tkyte@TK:E816> set define on Запрограммировать функцию на Java гораздо проще, чем на языке С, благодаря тому, что Java выполняет много действий автоматически, за кадром . Для обеспечения аналогичной функциональности на языке С потребовалось около 1000 строк кода. Выделение памяти, которое требует столько внимания при программировании на С, в случае Java - не проблема. В случае ошибки возбуждается исключительная ситуация. Индикаторные переменные, с которыми надо было возиться в языке С, вообще не нужны в 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[l] = Элемент 2 p in[2] - Элемент 3 p in[3] = Элемент 4 p in[4] = Элемент 5 l out(l) = Элемент 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-метода мы скопировали входной массив в выходной после распечатки метаданных и значений элементов массива.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |