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

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


1370

Глава 19

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

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

12 13 14 15 16 17 18

19 20 21

public static void pass(java.math.BigDecimal p in,

java.math.BigDecimal[] p out)

(p in != null)

System.out.println ( Перв параметр

p out[0 ]

+ p in.toString()) ; p in.negate() ;

System.out.println

( Устанавливаем параметр out равн

+ p out[0].toString());

Следующий метод работает с типом данных Oracle DATE. Он совпадает с представленным выше, за исключением того, что используются методы класса Timestamp для обработки даты. Наша задача - добавить к переданной дате один месяц:

2 6 27 28

2 9 30

32 33

34 35

37 38 39 40

42 43

public static void pass(java.sql.Timestamp p in,

java.sql.Tiraestamp[] p out)

(p in != null)

System.out.println ( Перв параметр +

p in.toString());

p out[0] if

p in;

(p out[0].getMonth() < 11) p out[0].setMonth(p out[0].getMonth()+l);

else

p out[0].setMonth(0); p out[0].setYear(p out[0].getYear()+l);



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

1371

44 45 46

47 }

System.out.println ( Устанавливаем параметр out равным

p out[0].toString());

Теперь переходим к самому простому из типов данных - String, который соответствует строковым типам SQL. Если вспомнить версию на языке С, с шестью формаль-н]ми параметрами, индикаторными переменными, атрибутами strlen, функциями strcpy и т.п., то по сравнению с ней эта реализация тривиальна:

51 {

54 55 56 57 58

61 62 }

public static void pass(java.lang.String p in,

java.lang.String[] pout)

if (p in != null)

System.out.println

( Перв параметр + p in.toString());

p out[0]

p in.toUpperCase();

System.out.println ( Устанавливаем параметр out равным

p out[0].toString());

В методе для данных типа CLOB придется выполнить ряд дополнительных действий. Для того чтобы показать, как принимать и возвращать большие объекты, здесь выполняется копирование. Вы видите, что для изменения/чтения содержимого большого объекта используются стандартные потоки чтения/записи языка Java. В этом примере is - входной поток, a os - выходной. Метод копирует данные фрагментами по 8 Кбайт. Выполняется цикл чтения и записи, пока не закончатся считываемые данные:

public

64 65

66 throws

67 {

70 71

72 73

74 75

78 79 80 81

if {

static void pass(oracle.sql.CLOB p in,

oracle.sql.CLOB[] p out) SQLException, IOException

(p in != null && p out[0] != null)

System.out.println

( Перв параметр + p in.length()); System.out.println ( Первый параметр + p in.getSubString(l,80) + ) ;

Reader is = p in.getCharacterStream();

Writer os = p out[0].getCharacterOutputStream();

char buffer!] int length;

new char[8192];



1372

Глава 19

82 while((length-is.read(buffer,0,8192)) != -1)

83 os.write(buffer,0,length);

85 is.closeO;

86 os.close(); 87

8 8 System.out.println

8 9 ( Устанавливаем параметр out равным +

9 0 P out[0].getSubString(1,80));

91 J

92 J

Следующий метод - приватный (внутренний). Он выдает метаданные о переданном ему объекте типа oracle.sql.ARRAY. Для каждого из передаваемых Java трех типов массивов будет вызываться этот метод, информирующий о том, какого размера и типа массив передан:

94 private static void show array infо(oracle.sql.ARRAY p in)

95 throws SQLException

96 {

97 System.out.println( Тип массива +

9 8 p in.getSQLTypeName());

99 System.out.println( Код типа массива +

100 p in.getBaseType()) ;

101 System.out.println( Длина массива +

102 p in.length());

103 J

Теперь рассмотрим методы для обработки этих массивов. Использовать массивы несложно, если разобраться, как получать из них данные и изменять их. Получить данные очень просто; метод getArray() возвращает базовый массив данных. Приведя возвращаемое методом getArray() значение к нужному типу, мы получим Java-массив этого типа. Поместить данные в такой массив немного сложнее. Необходимо сначала получить дескриптор (метаданные) массива, а затем создать новый объект-массив с этим дескриптором и соответствующими значениями. Следующий набор методов продемонстрирует это для каждого из использованных типов массивов. Обратите внимание, что тексты методов практически совпадают, за исключением фактических обращений к массивам данных Java. Эти методы выдают метаданные для типа oracle.sql.ARRAY, выдают содержимое массива и копируют входной массив в выходной:

105 public static void pass num array(oracle.sql.ARRAY p in,

106 oracle.sql.ARRAY[] p out)

107 throws SQLException

108 {

109 show array infо(p in);

110 java.math.BigDecimal[] values = (BigDecimal[])p in.getArray(); 111

112 for(int i = 0; i < p in.length();

113 System.out.println( p in[ +i+ ] = + values[i].toString());



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

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