Нет, это не разрешено:
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_
, за которыми следуют числовые идентификаторы.