|
Программирование >> Oracle
1734 Приложение OWNER OBJECT NAME DBMS UTILITY Процедура NAME TOKENIZE Эта процедура разбивает строку, представляющую имя объекта, на компоненты. Для ссылок на объекты используется следующий синтаксис: [схема].[имя объекта].[процедурафункция]@[связь 6аэы данных] Процедура NAMETOKENIZE в строке такого вида выделяет три начальных компонента и связь базы данных. Кроме того, она сообщает, на каком байте от начала строки ею завершен анализ имени объекта. Ниже представлен простой пример, демонстрирующий, что можно получить при передаче процедуре имени объекта. Учтите, что имена реальн1х объектов передавать необязательно (соответствующие таблицы и процедуры могут и не существовать), но обязательно передавать допустимые имена объектов. Если передан недопустимый (синтаксически) идентификатор, процедура NAME TOKENIZE возбудит исключительную ситуацию. Это позволяет проверить с помощью процедуры NAME TOKENIZE, является ли строка символов допустимым идентификатором: scott@TKYTE816> declare 10 11 12 13 14 22 23 24 25 26 27 28 29 30 l a varchar2(30); l b varchar2(30); l c varchar2(30); l dblink varchar2(30); l next number; varchar2(255); type vcArray is table of l names vcArray := vcArray(owner.pkg.proc@database link, owner.tbl@database link, tbl, Owner .tbl, pkg.proc, owner.pkg.proc , proc, owner.pkg.procSdblink with junk, 123); begin in 1 l names.count loop begin dbms utility.name tokenize(name => l names(i), a => l a, b => l b, c => l c, dblink => l dblink, nextpos=> l next); dbms output.put line(name l names(i)); Пакет DBMS UTILITY 1735 31 dbms output.put line(A II l a); 32 dbms output.put line(B II l b); 33 dbms output.put line(C II l c); 34 dbms output.put line(dblink l dblink); 35 dbms output.put line(next l next 3 6 length(l names(i))); 37 dbms output.put line (-) ; 38 exception 39 when others then 40 dbms output.put line(name l names(i)); 41 dbms output.put line (sqlerrm) ; 42 end; 43 end loop; 44 end; 45 / name owner.pkg.prod@database link A OWNER B PKG C PROC dblink DATABASE LINK next 2 8 2 8 Как видите, процедура позволяет выделить компоненты имени объекта. Параметр NEXT получил значение длины строки - в данном случае анализ закончился, когда б]л достигнут конец строки. Поскольку мы задали полное имя объекта, все четыре компонента имени получили значения. Теперь рассмотрим другие примеры: name owner.tbl@database link A OWNER B TBL dblink DATABASE LINK next 2 3 2 3 name tbl A TBL B c dblink next 3 3 Обратите внимание, что параметры В иС остались пустыми. Хотя идентификатор объекта строится по принципу СХЕМА.ОБЪЕКТ.ПРОЦЕДУРА, процедура NAME TOKENIZE не поместила значение TBL в выходной параметр В. Она просто помещает первую часть имени в параметр А, следующую часть - в В и т.д. Параметры А, В и С не содержат логический компонент имени - они содержат первую найденную часть, вторую и т.д. name Owner . tbl A Owner B TBL 1736 Приложение А dblink next 11 11 Этот результат представляет определенный интерес. В предыдущих примерах процедура NAME TOKENIZE выдавала все имена в верхнем регистре. Дело в том, что все идентификаторы сервер переводит в верхний регистр, если только они не взят1 в ка-в1чки. Мы же передали идентификатор в кавычках. В таком идентификаторе процедура NAME TOKENIZE сохранит регистр символов, но кавычки удалит. name A dblink next pkg.proc PKG PROC 8 8 name dblink next owner.pkg.proc OWNER PROC 14 14 name dblink next proc PROC name owner.pkg.procSdblink with junk A OWNER B PKG C PROC dblink DBLINK next 22 31 В этом примере анализ прекратился раньше, чем б]л достигнут конец строки. Процедура NAME TOKENIZE сообщает, что прекратила анализ на 22-ом байте из 31. Это пробел перед строкой with junk. Процедура проигнорировала остаток строки после име- name 123 ORA-00931:missing identifier PL/SQL procedure successfully completed. Последний пример показывает, что при получении недопустимого идентификатора процедура NAME TOKENIZE возбуждает исключительную ситуацию. Она проверяет, является ли каждая возвращаемая лексема допустимым идентификатором. Это позво-
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |