Программирование >>  Oracle 

1 ... 316 317 318 [ 319 ] 320 321 322 ... 469


Хранимые процедуры на языке 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-метода мы скопировали входной массив в выходной после распечатки метаданных и значений элементов массива.



1 ... 316 317 318 [ 319 ] 320 321 322 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика