Нет, не разрешено:
SQL> CREATE OR REPLACE PACKAGE AF_CONTRACT AS -- spec
-- PROCEDURE my_rpcedure (emp_id NUMBER);
TYPE DTO_GRID AS OBJECT
(
ROWKEY NVARCHAR2(200),
COLUMNKEY NVARCHAR2(200),
CELLVALUE NVARCHAR2(200),
OLDVALUE NVARCHAR2(200),
TAG NVARCHAR2(200)
);
END AF_CONTRACT;
/
2 3 4 5 6 7 8 9 10 11 12
Warning: Package created with compilation errors.
SQL> SQL> sho err
Errors for PACKAGE AF_CONTRACT:
LINE/COL ERROR
-------- -----------------------------------------------------------------
3/4 PLS-00540: object not supported in this context.
SQL>
Если вы хотите создать тип, который просто передает данные между процедурами PL/SQL, используйте синтаксис PL/SQL RECORD:
SQL> CREATE OR REPLACE PACKAGE AF_CONTRACT AS -- spec
-- PROCEDURE my_rpcedure (emp_id NUMBER);
TYPE DTO_GRID IS RECORD
(
ROWKEY NVARCHAR2(200),
COLUMNKEY NVARCHAR2(200),
CELLVALUE NVARCHAR2(200),
OLDVALUE NVARCHAR2(200),
TAG NVARCHAR2(200)
);
END AF_CONTRACT;
/
2 3 4 5 6 7 8 9 10 11 12
Package created.
SQL>
Однако, если вам нужен тип, который можно использовать в операторе SQL, то есть в качестве входных данных для функции TABLE()
, вам нужно будет создать его как тип SQL. SQL и PL/SQL используют два разных механизма, и для механизма SQL видны только типы SQL.
Мой совет о необходимости типов SQL больше не актуален для более поздних версий Oracle. Конечно, в 11gR2 и 12c механизм SQL будет поддерживать SQL в пакетах PL/SQL, которые используют таблицы PL/SQL в предложении TABLE()
. Типы должны быть объявлены в спецификации пакета, поэтому общедоступны и видны механизму SQL. Под прикрытием Oracle генерирует типы SQL для каждого объявления. Вы можете определить эти типы, потому что их имена начинаются с SYS_PLSQL_
, за которыми следуют числовые идентификаторы.
person
APC
schedule
28.11.2011