|
Программирование >> Oracle
Пакет DBMS UTILITY 1737 ляет использовать ее для проверки допустимости имен в приложениях, создающих объекты в базе данных Oracle. Например, если создается средство построения модели данных и необходимо проверить допустимость имени, которое пользователь хочет задать для таблицы или столбца, можно применить процедуру NAME TOKENIZE. Процедуры СОММА TO TABLE, TABLE TO COMMA Эти две процедуры преобразуют, соответственно, список идентификаторов через запятую в PL/SQL-таблицу (COMMA TO TABLE) и PL/SQL-таблицу произвольных строк в строку-список через запятую (TABLE TO COMMA). Я выделил слово идентификаторов , потому что процедура COMMA TO TABLE использует для анализа строк процедуру NAMETOKENIZE. Поэтому необходимо задавать допустимые идентификаторы Oracle (или идентификаторы в кавычках). При этом, однако, элемент списка все равно не может быть длиннее 30 символов. Эта утилита наиболее полезна для приложений, которые хранят список, например, имен таблиц в одной строке, и преобразуют их по ходу работы в PL/SQL-таблицу. Применить эту таблицу для других целей не удастся. Универсальная процедура COMMA TO TABLE, работающая со строками данных, перечисленных через запятую, была представлена в главе 20. Там я демонстрирую на ее примере, как выбирать данные с помощью SELECT из PL/SQL-функции. Вот пример использования стандартной процедуры COMMA TO TABLE, показывающий, как она обрабатывает длинные и недопустимые идентификаторы: scott@TKYTE816> declare 2 type vcArray is table of varchar2(4 00 0); 3 4 l names vcArray :=vcArray(emp,dept,bonus, 5 a, b , c, 6 423, 456, 789, 7 123 , 456 , 789 , 8 This is a long string, longer then 32 characters , b ,c); 9 l tablen number; 10 l tab dbms utility.uncl array; 11 begin 12 for i in 1 .. l names.count 13 loop 14 dbms output.put line(chr(10) 15 [ l names(i) ]); 16 begin 17 18 dbms utility.comma to table(l names(i), 19 l tablen, l tab) ; 20 21 for j in l..l tablen 22 loop 23 dbms output.put line([ l tab(j) ]); 24 end loop; 1738 Приложение 2 6 l names(i) := null; 27 dbms utility.table to coa(l tab, 2 8 l tablen, l names(i)); 2 9 dbms output.put line(l names(i)); 30 exception 31 when others then 32 dbms output.put line(sqlerrm) ; 3 3 end; 34 end loop; 35 end; 36 / [emp,dept,bonus] [emp] [dept] [bonus] emp,dept,bonus Этот пример демонстрирует как по строке emp,dept,bonus строится таблица идентификаторов, которая затем снова преобразуется в строку. [a, b, c] [a] [ b ] [ c] a, b, c Этот пример показывает, что пробелы в списке сохраняются. Для удаления начальных и конечных пробелов, если они не нужны, надо использовать встроенную функцию TRIM. [123, 456, 789] ORA-00931: missing identifier Это показывает, что для применения процедуры к строке чисел необходимо изменить формат строки, как показано ниже: t 123 , 456 , 789 ] [ 123 ] [ 456 ] [ 789 ] 123 , 456 , 789 Числа в кавычках удалось извлечь из строки. Обратите внимание, однако, что в элементах таблицы сохранен не только начальный пробел, но и кавычки. Если они не нужны, удалять их придется отдельно. [ This is a long string, longer than 32 characters , b ,c] ORA-00972: identifier is too long PL/SQL procedure successfully completed. Последний пример показывает, что, если передан слишком длинный идентификатор (длиннее 30 символов), процедура возбуждает исключительную ситуацию. Рассматриваемые процедуры подходят только для строк длиной до 30 символов. Хотя процеду- Пакет DBMS UTILITY 1739 pa TABLE TO COMMA и позволяет формировать строку из элементов таблицы длиннее 30 символов, процедура COMMA TO TABLE не позволит преобразовать результат обратно в таблицу. Процедура DB VERSION и функция PORT STRING Процедура DB VERSION появилась в версии Oracle 8.0 для определения версии сервера в приложениях. Ее можно б1ло бы использовать, например, в пакете CRYPT PKG (см. раздел приложения А, посвященный пакету DBMS OBFUSCATION TOOLKIT), чтобы предупредить пользователей, пытающихся использовать для шифрования процедуры DES3 на сервере Oracle 8.1.5, что это не сработает, до того, как они начнут получать сообщения об ошибках. Интерфейс этой процедуры предельно прост: scott@TKYTE816> declare 2 l version varchar2(255) ; 3 l compatibility varchar2(2 55) ; 4 begin 5 dbms utility.db version(l version, l compatibility); 6 dbms output.put line(l version); 7 dbms output.put line(l compatibility); 8 end; 9 / 8.1.6.0.0 8.1.6 PLQL procedure successfully completed. При этом она в1дает более детальную информацию, чем более старая функция PORT STRING: scott@TKYTE816> select dbms utility.port string from dual; PORT STRING IBMPC/WIN NT-8.1.0 Функция PORT STRING не только вынуждает анализировать полученную строку, но и не позволяет определить, работаем ли мы с сервером версии 8.1.5, 8.1.6 или 8.1.7. Процедура DB VERSION для получения такой информации подходит больше. С другой стороны, функция PORT STRING позволяет определить, на какой операционной системе работает сервер. Функция GET HASH VALUE Эта функция возвращает для переданной строки числовое хеш-значение. Ее можно использования для создания собственной PL/SQL-таблицы со строковыми индексами или, как было показано в разделе, посвященном пакету DBMS LOCK, для реализации других алгоритмов. Учтите, что алгоритм, используемый для реализации функции GET HASH VALUE, менялся при переходе к следующей версии сервера, так что не надо использовать эту
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |