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

1 ... 314 315 316 [ 317 ] 318 319 320 ... 469


Хранимые процедуры на языке 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 {



1 ... 314 315 316 [ 317 ] 318 319 320 ... 469

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