|
Программирование >> Oracle
Пакет DBMS UTILITY 1731 12 13 14 else dbms output.put line( end if; Значение strval); end; Значение = c:\temp\ PL/SQL procedure successfully completed. Как видите, хотя пользователь SCOTT не может обратиться к представлению V$PARAMETER и выполнить команду SHOW PARAMETER, он может получить требуемое значение. Следует отметить, что параметры инициализации со значениями True/ False в файле init.ora будут выданы как числа: значение 1 обозначает ИСТИНУ (True), а значение 0 - ЛОЖЬ (False). Для параметров с несколькими значениями, например UTL FILE DIR, функция выдает только первое значение. Если использовать учетную запись, имеющую право для этой же базы данных выполнять команду SHOW PARAMETER: tkyte@TKYTE816> show parameter utl file dir NAME TYPE VALUE utl file dir можно получить все значения. string c:\temp, c:\oracle Процедура NAME RESOLVE Этой процедуре можно передать имя: процедуры верхнего уровня; функции верхнего уровня; пакета; синонима пакета, процедуры или функции верхнего уровня. Она выдает полное имя соответствующего объекта. Процедура позволяет узнать, является ли объект с указанным именем процедурой, функцией или пакетом и какой схеме он принадлежит. Рассмотрим простой пример: scott@TKYTE816> declare 10 11 12 13 type vcArray is table of varchar2(30); l types vcArray := vcArray(null, null, null, null, synonym, null, procedure, function, package); l schema l part1 l part2 l dblink l type l obj# begin varchar2(30); varchar2(30); varchar2(30); varchar2(30); number; number; 1732 Приложение 14 15 16 17 18 19 20 21 23 24 25 26 27 28 33 34 35 36 37 part1 part1 type dbms utility.name resolve(name => DBMS UTILITY , context => 1, schema => l schema, => l part1, part2 => l part2, dblink => l dblink, => l type, object number => l obj#); if l obj# IS NULL then dbms output.put line(Object not found or not valid.); else dbms output.put(l schema . nvl(l partl,l part2)); if l part2 is not null and l partl is not null then dbms output.put(. l part2); end if; dbms output.put line( is a l types(l type) with object id l obj# and dblink l dblink ); end if; end; SYS.DBMS UTILITY is a package with object id 2408 and dblink PL/SQL procedure successfully completed. Процедура NAME RESOLVE по синониму DBMS UTILITY определила, что речь идет о пакете, принадлежащем пользователю SYS. Следует отметить, что процедура NAME RESOLVE работает только для процедур, функций, пакетов и синонимов, ссылающихся на один из этих трех типов объектов. В частности, она не работает для таблиц. При попытке передать имя таблицы ЕМР в схеме пользователя SCOTT, например, вы получите следующее сообщение об ошибке: declare ERROR at line 1: ORA-06564: object emp does not exist ORA-06512: at SYS.DBMS UTILITY , line 68 ORA-06512: at line 9 Помимо того, что процедура NAME RESOLVE не работает с таблицами, индексами и другими объектами, она работает не так, как указано в документации, при разрешении синонимов, ссылающихся на удаленные объекты по связи базы данных. В документации написано, что если передать процедуре NAME RESOLVE синоним удаленного пакета или удаленной процедуры, то в качестве типа объекта будет возвращен синоним, а в качестве имени - имя связи базы данных. Проблема - в коде процедуры NAME RESOLVE (документация описывает предполагаемые результаты, но процедура не работает должным образом). В текущей реализации процедура NAME RESOLVE никогда не возвращает SYNONYM в качестве типа объекта. Вместо этого она уточняет Пакет DBMS UTILITY 1733 имя удаленного объекта и возвращает его имя и идентификатор -1. Например, я настроил связь базы данных и создал синоним X для пакета DBMS UTILITY@ora8i.world. При попытке уточнения имени этого синонима я получаю: SYS.DBMS UTILITY is a package with object id -1 and dblink PL/SQL procedure successfully completed. В выходном параметре DBLINK я должен был бы получить сообщение о том, что объект X - синоним и соответствующую информацию о связи. Как видите, однако, в переменной DBLINK мы получили значение Null, и единственный признак того, что пакет не является локальным, - значение -1 для идентификатора объекта. Не стоит предполагать, что эта особенность останется в следующих версиях СУБД Oracle. Б1ло доказано, что проблема - в реализации процедуры NAME RESOLVE, а не в документации. Документация правильно задает требования, но они некорректно реализованы. После исправления ошибки процедура NAME RESOLVE будет работать для удаленных объектов иначе. Поэтому следует либо избегать использования процедуры NAME RESOLVE для удаленных объектов, либо поместить вызов NAME RESOLVE в подпрограмму, решающую эту проблему. Когда реализация этой процедуры изменится, можно будет реализовать прежние особенности работы для фрагментов кода, которые от них зависят. Последнее замечание относительно процедуры NAME RESOLVE. Параметр CONTEXT плохо описан, а параметр OBJECT NUMBER не описан в документации вовсе. Про параметр CONTEXT написано только, что: ... должен быть целым числом от 0 до 8 На самом деле, его значение должно быть целым числом от 1 до 7, или будет получено сообщение об ошибке: declare ERROR at line 1: ORA-20005: ORU-10034: context argument must be 1 or 2 or 3 or 4 or 5 or 6 or 7 ORA-06512: at SYS.DBMS UTILITY , line 66 ORA-06512: at line 14 А если задать любое значение из этого диапазона, кроме 1, будет выдано одно из следующих сообщений об ошибке: ORA-04047: object specified is incompatible with the flag specified ORA-06564: object OBJECT-NAME does not exist Так что единственно допустимым значением контекста является 1. Параметр OBJECT NUMBER вообще не описан. Это идентификатор объекта (значение столбца OBJECT ID), который можно найти в представлениях DBA OBJECTS, ALL OBJECTS и USER OBJECTS. Например, возвращаясь к первому примеру, где было выдано значение OBJECT ID 2048, можно выполнить запрос: scott@TKYTE816> select owner, object name 2 from all objects 3 where object id = 2 40 8;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |