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

1 ... 384 385 386 [ 387 ] 388 389 390 ... 469


Пакет 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. Так что сеанс придется начинать заново.



1 ... 384 385 386 [ 387 ] 388 389 390 ... 469

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