Информация, приведенная в этой заметке моего блога, возможно не столь очевидна. Она поможет вам в работе с вложенными таблицами и VARRAY
. Эти служебные аспекты не актуальны при работе с ассоциативными массивами.
Необходимые привилегии
Типы данных коллекций PL/SQL, находящиеся в базе данных, могут совместно использоваться несколькими пользователями. Как нетрудно догадаться, в совместном использовании задействованы привилегии. К счастью, ситуация не так сложна; к типам коллекций относится только одна привилегия Oracle — EXECUTE
. Если вы, пользователь Scott
, хотите разрешить пользователю Joe использовать тип color_tab_t
в его программах, достаточно предоставить ему привилегию EXECUTE
:
GRANT EXECUTE on color_tab_t TO JOE;
После этого Джо сможет использовать тип в синтаксисе схема.тип.
Пример:
CREATE TABLE my_stuff_to_paint (
which_stuff VARCHAR2(512),
paint_mixture SCOTT.color_tab_t
)
NESTED TABLE paint_mixture STORE AS paint_mixture_st;
Привилегии EXECUTE
также необходимы пользователям для запуска анонимных блоков PL/SQL, использующих объектный тип. Это одна из причин, по которым рекомендуется назначать имена модулям PL/SQL — пакетам, процедурам, функциям.
Для таблиц, включающих столбцы коллекций, традиционные привилегии SELECT, INSERT, UPDATE
и DELETE
имеют смысл, пока не потребуется построить коллекцию в PL/SQL для какого-либо из столбцов. Но если пользователь собирается выполнить команду INSERT
или UPDATE
для содержимого столбца коллекции, он должен иметь привилегию EXECUTE
для типа, потому что это необходимо для использования конструктора по умолчанию.
Коллекции и словарь данных
База данных Oracle поддерживает несколько представлений словарей данных, которые предоставляют информацию о типах коллекций VARRAY
и вложенных таблиц (табл. 1).
Для получения ответа на вопрос... | …используется представление… | как в следующем примере |
Какие типы коллекций я создал? | ALL_TYPES | SELECT type_name FROM all_types WHERE owner = USER AND typecode ='COLLECTION'; |
Как выглядело исходное определение типа коллекции Foo_t ? | ALL_SOURCE | SELECT text FROM all_source WHERE owner = USER AND name = 'FOO_T' AND type = 'TYPE' ORDER BY line; |
Какие столбцы реализуют Foo_t ? | ALL_TAB_COLUMNS | SELECT table_name,column_name FROM all_tab_columns WHERE owner = USER AND data_type = 'FOO_T'; |
Какие объекты базы данных зависят от Foo_t ? | ALL_DEPENDENCIES | SELECT name, type FROM all_dependencies WHERE owner = USER AND referenced_name='FOO_T'; |