Oracle для профессионалов




Передача данных - часть 4


Наконец, для полноты изложения я продемонстрирую использование функций для возвращения данных простых скалярных типов:

55 56 function return_number return number 57 as 58 language java 59 name 'demo_passing_pkg.return_num() return java.math.BigDecimal'; 60 61 function return_date return date 62 as 63 language java 64 name 'demo_passing_pkg.return_date() return java.sql.Timestamp'; 65 66 function return_string return varchar2 67 as 68 language java 69 name 'demo_passing_pkg.return_string() return java.lang.String'; 70 71 end demo_passing_pkg; 72 /

Package created.

Эта спецификация пакета практически совпадает (за исключением процедур для данных типа BOOLEAN) с той, что использовалась для внешних процедур на языке C. В этом примере я поместил уровень связывания непосредственно в спецификацию, чтобы не пришлось писать избыточное тело пакета (все функции написаны на языке Java).

Рассмотрим Java-код, реализующий использованные выше функции. Начнем с определения Java-класса demo_passing_pkg:

tkyte@TKYTE816> set define off

tkyte@TKYTE816> create or replace and compile 2 java source named "demo_passing_pkg" 3 as 4 import java.io.*; 5 import java.sql.*; 6 import java.math.*; 7 import oracle.sql.*; 8 import oracle.jdbc.driver.*; 9 10 public class demo_passing_pkg extends Object 11 {

В первом из представленных далее методов демонстрируется единственно возможный способ передачи параметров в режиме OUT функции на Java; фактически мы передаем массив из одного элемента. При изменении значения в массиве изменяется параметр, переданный в режиме OUT. Вот почему все эти методы в качестве второго параметра принимают массив. Значение

p_out[0] можно изменять, и оно будет передано методом в вызывающую среду. Изменения значения p_in в вызывающую среду не передаются.

Интересная особенность данного метода — отсутствие индикаторной переменной. Язык Java поддерживает понятие неопределенного объекта (null) в объектных типах, как и языки SQL и PL/SQL. Он, однако, не поддерживает трехзначную логику, как SQL; операции X IS NOT NULL нет — можно только непосредственно сравнивать объект с null. Не перепутайте и не пытайтесь писать условия вида p_in <> NULL в PL/SQL-коде, поскольку они не будут работать корректно.




Содержание  Назад  Вперед