|
Программирование >> Oracle
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, ограничившись только простыми наборами данных скалярных типов.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |