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

1 ... 434 435 436 [ 437 ] 438 439 440 ... 469


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 возбуждает исключительную ситуацию. Она проверяет, является ли каждая возвращаемая лексема допустимым идентификатором. Это позво-



1 ... 434 435 436 [ 437 ] 438 439 440 ... 469

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