|
Программирование >> Oracle
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());
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |