Не, не е разрешено:
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_
последвано от цифрови идентификатори.