Пользовательский тип Oracle внутри определения пакета

возможно ли иметь определяемый пользователем тип внутри определения пакета Oracle? Когда я пытаюсь следовать

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;
/
CREATE OR REPLACE PACKAGE BODY AF_CONTRACT AS  -- body

--   PROCEDURE my_procedure (emp_id NUMBER) IS
--   BEGIN
--      
--   END my_procedure;

END AF_CONTRACT;

я всегда получаю ошибку

Error: PLS-00540: object not supported in this context.

в определении типа.


person llasarov    schedule 28.11.2011    source источник


Ответы (2)


Типы объектов должны быть объявлены на уровне базы данных. Вы можете объявить тип коллекции в спецификации пакета.

Возможный дубликат: Возможно создать объект базы данных Oracle типы внутри PL/SQL?

person Ollie    schedule 28.11.2011

Нет, не разрешено:

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