Подтвердить что ты не робот

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

Можно ли создать тип объекта внутри пакета в Oracle Database 10g? Что-то вроде:

create or replace package my_package as 
    type my_type as object (
        id number(15) 
     ); 
end;

дает:

Ошибка (3,9): PLS-00540: объект не поддерживается в этом контексте.

В конечном итоге я хочу использовать полиморфизм, но также позволяю объектам получать доступ к таблицам и использовать PL/SQL, что недопустимо для типов, определенных вне пакетов.

Спасибо, Джефф

4b9b3361

Ответ 1

Из Документация Oracle 10g:

В настоящее время вы не можете определить объект типы в блоке PL/SQL, подпрограмме, или пакет.

Итак, к сожалению, нет.

Ответ 2

Обновление для Oracle 11g Release 2:

Из Глава 3 Использование PL/SQL с типами объектов Руководство для разработчиков баз данных Oracle Database:

Использование типов объектов в PL/SQL-блоке, подпрограмме или пакете является двухэтапным процессом.

  • Вы должны определить типы объектов, используя оператор SQL CREATE TYPE, в SQL * Plus или других подобных программах.

    После того, как тип объекта определен и установлен в схеме, вы можете использовать его в любом PL/SQL-блоке, подпрограмме или пакете.

  • В PL/SQL вы объявляете переменную, тип данных которой определяется пользователем или ADT, который вы только что определили.

Ответ 3

Вы можете использовать PL/SQL в объектах, которые определены вне пакета PL/SQL! Использовать тела объектов:

CREATE TYPE person_typ AS OBJECT (
  idno           NUMBER,
  first_name     VARCHAR2(20),
  last_name      VARCHAR2(25),
  email          VARCHAR2(25),
  phone          VARCHAR2(20),
  MAP MEMBER FUNCTION get_idno RETURN NUMBER, 
  MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ ));
/

CREATE TYPE BODY person_typ AS
  MAP MEMBER FUNCTION get_idno RETURN NUMBER IS
  BEGIN
    RETURN idno;
  END;
  MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ ) IS
  BEGIN
    -- use the PUT_LINE procedure of the DBMS_OUTPUT package to display details
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(idno) || ' ' || first_name || ' ' || last_name);
    DBMS_OUTPUT.PUT_LINE(email || ' '  || phone);
  END;
END;
/

скопируйте этот пример из этой ссылки: http://www.mcs.csueastbay.edu/support/oracle/doc/10.2/appdev.102/b14260/adobjint.htm