|
Программирование >> Oracle
Хранимые процедуры на языке Java 1361 ных DB2 и все перечисленные потрясающие возможности не нужны, достаточно загрузить в базу данных драйверы JDBC для DB2, написанные на языке Java, и воспользоваться ими (естественно, это применимо не только для СУБД DB2). По сути, любой из миллионов имеющихся не интерактивных (не обладающих пользовательским интерфейсом) фрагментов Java-кода можно загрузить в базу данных Oracle и использовать. Вот почему фрагменты Java-кода постоянно встречаются в приложениях. Я предпочитаю использовать язык Java, только когда это удобно и необходимо. Я по-прежнему считаю PL/SQL подходящим средством для создания подавляющего большинства хранимых процедур. Написав одну-две строки PL/SQL-кода, можно получить тот же результат, что и в случае многострочной программы на Java/JDBC. Препроцессор SQLJ уменьшает объем необходимого кода, но выдаваемый им код по производительности уступает сочетанию языков PL/SQL и SQL. Производительность кода на PL/ SQL при взаимодействии с SQL выше, чем для сочетания Java/JDBC, как и можно было предположить. Язык PL/SQL проектировался как расширение SQL, и они очень тесно интегрированы. Большинство типов данных языка PL/SQL - это стандартные типы дан-н]х SQL, а все типы данных SQL включены в PL/SQL. Между этими языками нет несоответствия типов. Доступ к SQL из кода на Java выполняется средствами функционального интерфейса, добавленного к языку. Каждый тип данных SQL необходимо преобразовать в некий тип данных Java, и, наоборот, все SQL-операторы выполняются процедурно, т.е. между этими языками нет тесной связи. Итак, если выполняется обработка данных в базе, надо использовать язык PL/SQL. Если надо на время выйти за пределе! базы данных (например, чтобы отправить сообщение по электронной почте), лучшим средством для этого является язык Java. Если необходимо выполнить поиск в сообщениях электронной почты, хранящихся в базе данных, используйте язык PL/SQL. Если же необходимо загрузить сообщения электронной почты в базу данных, используйте Java. Как работают внешние процедуры на языке Java Оказывается, внешние процедуры на языке Java (термин внешняя процедура в данном случае является синонимом хранимой процедуры ) создавать значительно проще, чем на языке С. Например, в предыдущей главе, посвященной созданию внешних процедур на языке С, пришлось решать следующие проблемы. Управление cоcтоянием. Внешние процедуры могут потерять информацию о состоянии (текущие значения статических или глобальных переменных). Это связано с используемым механизмом кэширования динамически подключаемых библиотек. Поэтому необходим механизм определения и сохранения состояния в программах на языке С. Механизме! траccировки. Внешние процедуры выполняются на сервере как от-дельн1й процесс. Хотя на некоторых платформах эти процедуры можно отлаживать с помощью обычного отладчика, это весьма сложно и, если ошибки возни- 1362 Глава 19 кают только при одновременном использовании внешней процедуры большим количеством пользователей, просто невозможно. Необходимо средство генерации трассировочных файлов по требованию, начиная с этого момента . Использование параметров. Необходимо средство параметризации внешних процедур, чтобы можно было управлять их работой извне с помощью файла параметров, аналогично тому, как файл init.ora используется для управления севером. Общая обработка ошибок. Необходимо простое средство выдачи пользователю вразумительных сообщений об ошибках. При использовании языка Java оказывается, что управление состоянием, трассировка и общая обработка ошибок уже не является проблемой. Для сохранения информации о состоянии достаточно объявить переменные в создаваемгх Java-классах. Для обеспечении простейшей трассировки можно использовать вызовы System.out.println. Общую обработку ошибок можно выполнять с помощью функции RAISE APPLICATION ERROR i-ка PL/SQL. Все это продемонстрировано в следующем коде: tkyte@TKYTE816> create or replace and compile 2 java source named demo 3 as 4 import java.sql.SQLException; 5 6 public class demo extends Object 9 static int counter = 0; 10 11 public static int IncrementCounter() throws SQLException 12 { 13 System.out.println( Вход в функцию IncrementCounter, -> counter = +counter); 14 if (++counter >= 3) 15 { 16 System.out.println( Ошибка counter= +counter); 17 #sql { 18 begin raise application error(-20001, -> Слком много вызовов); end; 19 J; 20 J 21 System.out.println( Выход из функции IncrementCounter, -> counter = +counter); 22 return counter; 23 J 24 J 25 / Java created. Состояние поддерживается с помощью статической переменной counter. Наша простая демонстрационная программа будет увеличивать счетчик при каждом вызове, а Хранимые процедуры на языке Java 1363 начиная с третьего и при последующих вызовах, будет автоматически выдавать сообщение об ошибке. Обратите внимание, что для создания небольших фрагментов кода вроде этого можно использовать утилиту SQL*Plus, непосредственно загружающую Java-код в базу данных, автоматически компилируя его в байт-код и запоминая в соответствующих структурах. Ни внешний компилятор, ни средства разработки JDK при этом не нужны - достаточно SQL-оператора CREATE OR REPLACE. Именно так я и предпочитаю создавать хранимые процедуры на языке Java. Это упрощает их установку на любой платформе. Не нужно запрашивать имя пользователя и пароль, как при использовании ко-манд1 LOADJAVA (это утилита командной строки для загрузки исходного кода, классов Java или jar-файлов в базу данных). Не надо думать о каталогах для поиска классов (classpath) и других подобных нюансах. В приложении А мы рассмотрим утилиту DJAVA и пакет DBMS JAVA, обеспечивающий интерфейс к программе LOADJAVA. Этот метод (с использованием оператора CREATE OR REPLACE) загрузки небольших Java-функций в базу данных особенно хорошо подходит для тех, кто только начинает осваивать технологии Java. Вместо установки JDBC-драйверов, среды разработки JDK, настройки списка каталогов для поиска классов можно просто компилировать код в базе данных, точно так же, как при создании программных единиц PL/SQL. Сообщения об ошибках компиляции выдаются точно так же, как и при использовании языка PL/SQL, например: tkyte@TKYTE816> create or replace and compile 2 java source named demo2 3 as 4 5 public class demo2 extends Object 8 public static int my routine() 10 System.out.println( Bxoд в функцию my routine ); 12 return counter; 13 } 14 } 15 / Warning: Java created with compilation errors . tkyte@TKYTE816>show errors java source demo2 Errors for JAVA SOURCE demo2 : LINE/COL ERROR 0/0 demo2:8: Undefined variable: counter 0/0 Info: 1 errors Это показывает, что функция my routine, определенная в строке 8, обращается к необъявленной переменной. Не приходится выискивать ошибку в коде, поскольку получено информативное сообщение о ней. Я не раз убеждался, что многократных оши-
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |