|
Программирование >> Oracle
Хранимые процедуры на языке Java 1367 Java-класс будет создан для тех же целей, что и представленная в предыдущей главе динамически подключаемая библиотека на языке С. Начнем с SQL-операторов для создания трех типов наборов - они совпадают с использовавшимися в примередля языка С в предыдущей главе: tkyte@TKYTE816> create or replace type numArray as table of number; Type created. tkyte@TKYTE816> create or replace type dateArray as table of date; Type created. tkyte@TKYTE816> create or replace type strArray as table of varchar2(255) ; Type created. Теперь рассмотрим спецификацию PL/SQL-пакета для этого примера. Она будет состоять из набора перегруженных процедур и функций для проверки приема и передачи параметров в хранимых процедурах на языке Java. Каждая подпрограмма имеет параметр, предаваемый в режиме IN, и параметр, передаваемый в режиме OUT, что позволяет продемонстрировать передачу данных в Java-код и возвращение результатов. Первая процедура передает числовые данные. Данные Oracle типа NUMBER будут передаваться как Java-тип BigDecimal. Их можно принимать и как данные типа int, и как строки и как другие типы, но при этом возможна потеря точности. Данные типа BigDecimal могут без проблем принять любое значение типа NUMBER от сервера Oracle. Обратите внимание, что параметр, передаваемый в режиме OUT, на уровне Java принимается как массив данных типа BigDecimal. Так будет для всех параметров, передаваемых Java в режиме OUT. Для изменения параметра, переданного Java, нужно передавать массив параметров (в этом массиве будет только один элемент) и изменять соответствующий элемент массива. Далее, при описании кода на языке Java, вы увидите, как это сказывается на исходном коде. tkyte@TKYTE816> create or replace package demo passing pkg 2 as 3 procedure pass(p in in number, p out out number) 4 as 5 language java 6 name demo passing pkg.pass(java.math.BigDecimal, 7 java.math.BigDecimal[]) Даты Oracle сопоставляются типу данных Timestamp. И в этом случае можно б1ло бы сопоставить датам множество других типов, например String, но во избежание потери информации при неявных преобразованиях я выбрал тип Timestamp, который позволяет сохранить все данные, содержащиеся в объектах Oracle типа DATE. 9 procedure pass(p in in date, p out out date) 10 as 11 language java 12 name demo passing pkg.pass(java.sql.Timestamp, 13 java.sql.Timestamp[]); Строки типа VARCHAR2 передаются очень просто - как данные типа java.lang.String. 1368 Глава 19 14 15 16 17 18 19 procedure pass(p in in varchar2, p out out varchar2) as language java name demo passing pkg.pass(java.lang.String, java.lang.String[]); Для данных типа CLOB мы используем предоставляемый Oracle Java-тип oracle.sql.CLOB. С помощью этого типа мы сможем получить входной и в1ходной потоки данных, используемые чтения и записи данных типа CLOB. 23 24 procedure pass(p in in CLOB, p out in out CLOB) as language java name demo passing pkg.pass(oracle.sql.CLOB, oracle.sql.CLOB[]) ; Теперь перейдем к наборам: вы видели, что, независимо от типа фактически предаваемого набора, используется один и тот же предоставляемый Oracle тип. Вот почему в данном случае Java-функции не являются перегруженными, как все предыдущие (пока что все вызываемые Java-функции назывались demo passing pkg.pass). Поскольку типы наборов передаются как один и тот же тип Java, перегрузку имен использовать нельзя - необходимо называть функцию в соответствии с реально передаваемым типом данных: 30 31 38 39 40 41 42 43 procedure pass(p in in numArray, p out out numArray) as language java name demo passing pkg.pass num array(oracle.sql.ARRAY, oracle.sql.ARRAY[]) ; procedure pass(p in in dateArray, p out out dateArray) as language java name demo passing pkg.pass date array(oracle.sql.ARRAY, oracle.sql.ARRAY[]); procedure pass(p in in strArray, p out out strArray) as language java name demo passing pkg.pass str array(oracle.sql.ARRAY, oracle.sql.ARRAY[]); Следующие две процедуры демонстрируют сопоставление для типов RAW и INT. SQL-тип RAW будет сопоставляться встроенному типу byte языка Java. Для целых чисел будет использоваться встроенный тип данных int языка Java: 44 45 46 47 procedure pass raw(p in in RAW, p out out RAW> as language java Хранимые процедуры на языке Java 1369 48 name demo passing pkg.pass(byte[], byte[][]); 49 50 procedure pass int(p in in number, 51 p out out number) 52 as 53 language java 54 name demo passing pkg.pass int(int, int[]); Наконец, для полноты изложения я продемонстрирую использование функций для возвращения данных простых скалярных типов: 56 function return number return number 57 as 58 language java 59 name demo passing pkg.return num() return java.math.BigDecimal; 61 function return date return date 62 as 63 language java 64 name demo passing pkg.return date() return java.sql.Timestamp; 66 function return string return varchar2 67 as 68 language java 69 name demo passing pkg.return string() return java.lang.String; 71 end demo passing pkg; 72 / Package created. Эта спецификация пакета практически совпадает (за исключением процедур для данных типа BOOLEAN) с той, что использовалась для внешних процедур на языке С. В этом примере я поместил уровень связывания непосредственно в спецификацию, чтобы не пришлось писать избыточное тело пакета (все функции написаны на языке 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 {
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |