Пользовательский тип Oracle внутри определения пакета - PullRequest
10 голосов
/ 28 ноября 2011

возможно ли иметь определяемый пользователем тип в определении пакета 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.

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

Ответы [ 2 ]

15 голосов
/ 28 ноября 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_, за которыми следуют числовые идентификаторы.

3 голосов
/ 28 ноября 2011

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

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

...