|
Программирование >> Oracle
Пакет DBMS JAVA Пакет DBMS JAVA весьма загадочен. Это PL/SQL-пакет, но он не описан в справочном руководстве Supplied PL/SQL Packages Reference. Пакет создавался для поддержки Java на сервере, так что можно предположить, что он описан в справочном руководстве Supplied Java Packages Reference (но там о нем тоже ничего нет). Описан этот пакет в руководстве OracleSi Java Developers Guide. Я уже многократно упоминал и использовал его в примерах, не вникая в детали. Пришло время рассмотреть процедуры этого пакета и описать их назначение и особенности использования. В пакет DBMS JAVA входит почти 60 процедур и функций, но лишь некоторые из них действительно полезны для разработчиков ПО. Основная часть пакета предназначена для отладчиков (точнее, для тех, кто создает программы-отладчики). Кроме того, пакет включает ряд служебных подпрограмм и утилит экспорта/импорта. Все эти функции и процедуры мы рассматривать не будем. Функции LONGNAME и SHORTNAME Это служебные функции для преобразования коротких, 30-символьных идентификаторов (все идентификаторы Oracle - не длиннее 30 символов) в длинные имена Java, и наоборот. В словаре данных обычно находятся хешированные имена Java-классов, загруженных в базу данных. Причина в том, что их исходные имена - слишком длинные, а сервер такие имена не поддерживает. Эти две функции позволяют получить реальное имя по короткому (значению столбца OBJECT NAME в представлении USER OBJECTS), а также короткое имя для полного имени. Вот пример использования этих функций пользователем SYS (которому принадлежит много фрагментов Java-кода, если в базе данных установлена поддержка Java): Пакет DBMS JAVA 1585 sys@TKYTE816>column long nm format a3 0 word wrapped sys@TKYTE816> column short nm format a30 sys@TKYTE816> select dbms java.longname(object name) long run, 2 dbms java.shortname(dbms java.longname(object name)) short nm 3 from user objects where object type = JAVA GLASS 4 and rownum < 11 LONG NM SHORT NM com/visigenic/vbroker/ir/Gonst/1001a851 GonstantDefImpl antDefImpl oracle/sqlj/runtime/OraGustomD/1007 6b23 OraGustomDatumGlosur atumGlosure com/visigenic/vbroker/intercep/103 22 58 8 HandlerRegistryHelpe tor/HandlerRegistryHelper 10 rows selected. Как видите, применив функцию LONGNAME к значению OBJECT NAME, можно получить исходное имя Java-класса. Если применить к этому длинному имени функцию SHORTNAME, мы снова получим короткое хешированное имя, используемое внутренне сервером Oracle. Установка опций компилятора Для компилятора Java в базе данных можно задавать большинство опций, причем двумя способами. Опции можно задавать в командной строке при использовании процедуры loadjava или в таблице JAVA$OPTIONS. Опция, установленная в командной строке, всегда используется вместо соответствующего значения из таблицы JAVA$OPTIONS. Это, конечно же, происходит только при использовании компилятора Java в базе данных Oracle. Если используется отдельный компилятор Java вне базы данных (например, в среде JDeveloper), опции надо устанавливать в соответствующей среде. Можно устанавливать три опции компилятора, каждая из которых связана с преком-пилятором SQLJ (это Java-прекомпилятор, преобразующий встроенные операторы SQL в вызовы интерфейса JDBC), встроенным в базы данных. Эти опции представлены в следующей таблице. Опция Назначение Возможные значения ONLINE Выполнять ли проверку типов при True/False компиляции (online) или при выполнении DEBUG Компилировать ли Java-код с включенной True/False отладкой. Аналог вызова javac -g из командной строки ENCODING Кодировка исходного файла для Стандартно используется компилятора кодировка Latin1 Стандартные значения опций выделены полужирным. 1586 Приложение А Я продемонстрирую использование средств пакета DBMS JAVA для установки опций компилятора на примере опции online прекомпилятора SQLJ. Обычно эта опция имеет стандартное значение True, что требует от прекомпилятора SQLJ проверять семантику SQLJ-кода. Это означает, что прекомпилятор SQLJ обычно проверяет существование всех упомянутых в коде объектов базы данных, соответствие типов хост-переменных и т.п. Если необходимо делать эти проверки при выполнении (например, потому, что таблицы, на которые ссглается SQLJ-код, еще не созданы, но хотелось бы загрузить код в базу без ошибок), можно отключить проверку семантики с помощью процедуры DBMS JAVA.SET COMPILER OPTION. Для иллюстрации используем следующий фрагмент кода. В нем выполняется попгтка вставить данные в таблицу, которой в базе данных еще нет: tkyte@TKYTE816>create or replace and compile 10 11 12 13 14 15 java source named bad code as import java.sql.SQLException; public class bad code extends Object { public static void wont work() throws SQLException #sql { insert into non existent table values (1) Java created. tkyte@TKYTE816>show errors java source bad code Errors for JAVA SOURCE bad code: LINE/COL ERROR 0/0 0/0 0/0 0/0 0/0 0/0 bad code:7: Warning: Database issued an error: PLS-00201: identifier NON EXISTENT TABLE must be declared insert into non existent table values ( 1 ) #sql { Info: 1 warnings Теперь установим опции компилятора ONLINE значение FALSE. Для этого необходимо отключиться от сервера и подключиться снова. Проблема связана с тем, что среда времени выполнения языка Java проверяет существование таблицы JAVA$OPTIONS только при запуске. Если таблицы нет, повторных попыток прочитать из нее данные в сеансе не делается. Процедура DBMS JAVA.SET COMPILER OPTION создаст эту таблицу автоматически, но только если она вызвана до запуска среды времени выполнения языка Java. Так что сеанс придется начинать заново.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |