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

1 ... 319 320 321 [ 322 ] 323 324 325 ... 469


1382

Глава 19

4 import java.lang.String;

5 import java.sql.Timestamp;

7 public class MyTimestamp

9 public static String getTimestamp()

10 {

11 return (new

12 Timestamp(System.currentTimeMillis())).toString();

13 J

14 J;

15 /

Java created.

tkyte@TKYTE816> create or replace function my timestamp return varchar2

2 as language java

3 name MyTimestamp.getTimestampO return java.lang.String;

Function created.

tkyte@TKYTE816> select my timestamp,

2 to char(sysdate,yyyy-mm-dd hh24:mi:ss) from dual

MY)TIMESTAMP TO CHAR(SYSDATE,YY

2001-03-27 19:15:59.688 2001-03-27 19:15:59

Возможные ошибки

Большинство сообщений об ошибках, которые вы получите при использовании хре-нимых процедур на Java, связаны с компиляцией кода и несоответствием типов параметров. Некоторые из наиболее типичных сообщений об ошибках рассмотрены ниже.

ORA-29549 Java Session State Cleared

По ходу разработки можно столкнуться с сообщениями следующего вида:

select mytimestamp, to char(sysdate,yyyy-mm-dd hh24:mi:ss) from dual

ROR at line 1:

ORA-29549: class Y.MyTimestamp has changed, Java session state cleared Это означает, что использованный в сеансе класс б1л перекомпилирован (скорм

всего - вами же). Вся связанная с этим классом информация о состоянии потеряна.

Достаточно повторно выполнить оператор, при выполнении которого было выдано это

сообщение, и информация о состоянии обновится.

По этой причине следует избегать повторной загрузки Java-классов в действующе*

производственной системе. После этого использующий Java-класс сеанс при обращении

к нему получит такое сообщение об ошибке.



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

Ошибки прав доступа

Мы уже знакомы с таким сообщением: EOR at line 1:

ORA-29532: Java call terminated by uncaught Java exception: java.security.AccessControlException:

the Permission (java.io.FilePermission c:\temp read) has not been granted by dbms java.grant permission to

SchemaProtectionDomain(TKYTE IPolicyTableProxy(TKYTE)) ORA-06512: at TKYTE.GET DIR LIST, line 0

ORA-06512: at line 1

К счастью, в тексте сообщения об ошибке явно указано, какие привилегии необходимо получить, чтобы вызов б]л успешным. Обладающий соответствующими привилегиями пользователь должен предоставить вам эти привилегии с помощью процедуры GRANT PERMISSION пакета DBMS JAVA.

ORA-29531 no method X in class Y

Если в рассмотренном ранее примере RunThis изменить спецификацию вызова следующим образом:

tkyte@TKYTE816>create or replace

2 function RUN C(p cmd in varchar2) return number

3 as

4 language java

5 name Util.RunThis(String[]) return integer; 7 /

Function created.

будет вщано сообщение об ошибке ORA-29531. Обратите внимание, что в списке пара-пв функции Util.RunThis, я указал тип данн1х String, а не java.lang.String.

(kyte@TKE816> exec rcCc:\winnt\system32\cmd.exe /с dir) java.lang.NullPointerException

at oracle.aurora.util.JRIExtensions.getMaximallySpecificMethod(JRIExtensions.java) at oracle.aurora.util.JRIExtensions.getMaximallySpecificMethod(JRIExtensions.java) BEGIN RC(c:\winnt\system32\cmd.exe /c dir); sD

ERROR at line 1:

ORA-29531: no method RunThis in class Util

ORA-06512: at TKYTE.RUN C , line 0 ORA-06512: at TKYTE.RC , line 5 ORA-06512: at line 1

Дело в том, что для успешного сопоставления типов данных должны указываться л (fully qualified) имена типов. Хотя класс java.lang неявно импортируется в Java-программах, он не импортируется на уровне языка SQL. Получив это сообщение об ошибке, необходимо проверить сопоставление типов данных и убедиться, что используются полн1е имена типов данных Java и что они в точности совпадают с именами



1384

Глава 19

имеющихся типов данных. Соответствующий Java-метод определяется по сигнатуре, а сигнатура создается на основе используемых типов данных. Минимальное различие в типах входных данных, результатов или регистре символов в имени приведет к несовпадению сигнатур, и сервер Oracle не найдет соответствующий код.

Резюме

В этой главе вы узнали, как реализовать хранимые процедуры на языке Java. Это не означает, что весь существующий код на языке PL/SQL необходимо переписать в виде хранимых процедур на Java. Но если, программируя на PL/SQL, вы столкнетесь с неразрешимой проблемой, что обычно происходит при необходимости выйти за пределы базы данных и обеспечить взаимодействие с операционной системой, попробуйте решить задачу с помощью языка Java.

Благодаря полученным в этой главе сведениям вы сможете передать основные тип1 данных SQL, в том числе массивы, с уровня PL/SQL на уровень Java-методов и получить результаты. Я представил несколько полезных фрагментов Java-кода, которые можно использовать непосредственно; обратившись к документации по языку Java, вы обнаружите десятки других фрагментов, незаменимых при разработке приложений.

При осторожном использовании, программирование на Java может существенно расширить возможности разработки приложений.



1 ... 319 320 321 [ 322 ] 323 324 325 ... 469

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