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

1 ... 313 314 315 [ 316 ] 317 318 319 ... 469


1364

Глава 19

бок при настройке JDBC/JDK/CLASSPATH можно легко избежать, загрузив за пару секунд код с помощью этого простого подхода.

Вернемся теперь к работающему примеру. Хочу обратить ваше внимание на одну важную деталь в созданном выше классе. Метод, вызываемый из языка SQ IncrementCounter, объявлен как статический. Он обязательно должен быть статическим. (Хотя не все должно быть статическим: при реализации статического метода можно использовать обычные методы). Для языка SQL необходим хотя бы один метод, который можно вызвать, не передавая неявно данные экземпляра с помощью скрытого параметра, вот почему нужен статический метод.

Теперь, после загрузки небольшого Java-класса, необходимо создать для него спецификацию вызова в языке PL/SQL. Эта процедура очень похожа на ту, что была описана в главе 18 для внешних процедур на языке С, когда мы сопоставляли типы данных С типам данных SQL. Именно это мы и сделаем сейчас; только на этот раз будут сопоставляться типы данных языка Java типам данных SQL:

tkyte@TKYTE816>create or replace

2 function java counter return number

3 as

4 language java

5 name demo.IncrementCounter() return integer;

Function created.

Теперь можно вызывать эту функцию:

tkyte@TKYTE816>set serveroutput on

tkyte@TKYTE816> exec dbms output.put line(java counter);

PL/SQL procedure successfully completed.

tkyte@TKYTE816> exec dbms output.put line(java counter); 2

PL/SQL procedure successfully completed.

tkyte@TKYTE816> exec dbms output.put line(java counter); BEGIN dbms output.put line(java counter); END;

ERROR at line 1:

ORA-29532: Java call terminated by uncaught Java exception: oracle.jdbc.driver.OracleSQLException: ORA-20001: Слишком иного вызовов

ORA-06512: at line 1

ORA-0 6512: at TKYTE.JAVA COUNTER , line 0

ORA-06512: at line 1

Как видите, информация о состоянии поддерживается автоматически, о чем свидетельствует увеличение счетчика с 1 до 2 и 3. Об ошибках сообщать тоже достаточно легко, но куда попадают результаты обращения к System.out.println? По умолчанию они попадают в файл трассировки. При наличии доступа к представлениям V$PROCESS, V$SESSION и V$PARAMETER можно определить имя файла трассировки в конфигура-



Хранимые процедуры на языке Java 1365

ции выделенного сервера следующим образом (этот пример предназначен для Windows -для ОС UNIX он будет аналогичным, но полученное имя файла будет другим):

tkyte@TKYTE816>select c.value\ORAto char(a.spid,fm00000).trc

2 from v$process a, v$session b, v$parameter c

3 where a.addr = b.paddr

4 and b.audsid = userenv(sessionid1)

5 and c.name = user dump dest

C.VALUE\ORATO CHAR(A.SPID,FM00000).TRC C:\oracle\admin\tkyte816\udump\ORA01236.trc

tkyte@TKYTE816> edit C:\oracle\admin\tkyte816\udump\ORA01236.trc

В этом файле можно обнаружить следующее:

Dump file C:\oracle\admin\tkyte816\udump\ORA01236.TRC

Tue Mar 27 11:15:48 2001

ORACLE V8.1.6.0.0 - Production vsnsta=0 vsnsql=e vsnxtr=3

Windows 2000 Version 5.0 , CPU type 586

Oracle8i Enterprise Edition Release 8.1.6.0.0 - Production

With the Partitioning option

JServer Release 8.1.6.0.0 - Production

Windows 2000 Version 5.0 , CPU type 586

Instance name: tkyte816

Redo thread mounted by this instance: 1

Oracle process number: 12

Windows thread id: 123 6, image: ORACLE.EXE *** 2001-03-27 11:15:48.820

*** SESSION ID:(8.11) 2001-03-27 11:15:48.810 Вход в функцию IncrementCounter, counter = 0 В1ход из функции IncrementCounter, counter = 1 Вход в функцию IncrementCounter, counter = 1 Выхода из функции IncrementCounter, counter = 2 Вход в функцию IncrementCounter, counter = 2 Ошибка! counter=3

oracle.jdbc.driver.OracleSQLException: ORA-20001: Слишком много вызовов

ORA-06512: at line 1

Я также мог бы использовать средства пакета DBMS JAVA для перенаправления этих результатов на экран утилиты SQL*Plus, чтобы избежать поиска соответствующего трассировочного файла при отладке функции. В этом разделе периодически упоминается пакет DBMS JAVA, но полное его описание будет представлено в соответствующем разделе приложения А.

Из этого небольшого примера понятно, что, по сравнению с созданием внешних процедур на языке С, создавать хранимые процедуры на Java - просто. Не нужно специально настраивать сервер - только инсталлировать Java в базу данных. Не нужен внешний компилятор. Многие средства, которые в случае языка С пришлось создавать самим, мы получаем от сервера автоматически. Это на самом деле просто.



1366

Глава 19

Я не описывал пока конфигурирование Java-кода с помощью файла параметров. Причина в том, что Java содержит встроенные средства для этого в виде класса java.util.Properties. Достаточно использовать метод load этого класса для загрузки ранее сохраненного набора свойств либо из большого объекта в таблице базы данных, либо из файла ОС, - что больше подходит.

Далее я представлю несколько полезн1х примеров храним1х процедур на языке Java, в частности, упоминавшихся ранее в разделе Когда используются хранимые процедуры на языке Java? . Но до этого я хочу переписать представленный в главе 18 пакет DEMO PASSING PKG на языке Java вместо С, чтобы продемонстрировать, как ре-давать и принимать основные типы данных SQL во внешних процедурах на языке Java.

Передача данных

В этом примере я собираюсь создать ряд процедур с параметром, передаваемым в режиме IN, и параметром, передаваемым в режиме OUT (или IN OUT). Мы напим по процедуре для каждого из интересующих нас типов данных (наиболее часто используемых). При этом будет продемонстрирован правильный способ передачи входных данных и получения результатов каждого типа. Кроме того, я создам несколько функций и покажу, как возвращать данные некоторых из этих типов. Меня при работе с Java интересуют следующие типы:

строки (размером до 32 Кбайт);

числа (произвольного масштаба и точности);

даты;

целые числа (включая данные типа binary integer);

данные типа RAW (размером до 32 Кбайт);

большие объекты (для любых данных размером более 32 Кбайт);

массивы строк;

массивы чисел;

массивы дат.

Этот список несколько отличается от аналогичного списка для внешних процедур на языке С. В частности, в нем не указан тип данных BOOLEAN. Дело в том, что пока соответствия между типом данных PL/SQL BOOLEAN и типами данных языка Java. Нельзя передавать данные типа BOOLEAN как параметры внешним процедурам, написанным на языке Java.

С помощью объектно-реляционных расширений можно создавать типы данн1х любой сложности. Для создания таких типов данных я рекомендую использовать поставляемое корпорацией Oracle Java-средство JPublisher. Оно автоматически создает Java-классы, соответствующие объектным типам. Подробнее о JPublisher можно почитать в руководстве Oracle8i JPublisher Users Guide, которое входит в набор документации, предлагаемой корпорацией Oracle. Как и в случае внешних процедур на языке С, мы не будем углубляться в особенности использования объектных типов в хранимых процедурах на Java, ограничившись только простыми наборами данных скалярных типов.



1 ... 313 314 315 [ 316 ] 317 318 319 ... 469

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