Объект Oracle deref из таблицы объектов

Я хотел бы знать, как наилучший способ получить объект из таблицы объектов Oracle в переменную deref.

Это мой фактический метод, допустим тип:

create or replace TYPE person AS OBJECT (
  dni            VARCHAR2(20),
  nom            VARCHAR2(20),
  MAP MEMBER FUNCTION get_dni RETURN varchar2
);

create or replace TYPE BODY person AS
  MAP MEMBER FUNCTION get_dni RETURN varchar2 IS
  BEGIN
    RETURN dni;
  END;
END;

С этой таблицей объектов:

create table partners of person;

Затем, чтобы получить person в var, я делаю:

declare
    a_person person;
begin
    select deref(ref(p)) into a_person
      from partners p 
     where p.dni = 1;
    ...
end;

Есть ли более элегантный способ получить объект unref?


person dani herrera    schedule 04.04.2014    source источник


Ответы (1)


Кажется, что нет действительно элегантной альтернативы вашему стилю объявления таблицы.

Единственный вариант ниже, но он кажется менее элегантным, чем ваш:

declare
  a_person person;
begin
  select person(p.dni, p.nom) into a_person
  from partners p 
  where p.dni = 1;
end;

т.е. разложить объект на поля и построить его обратно.

Но если вы объявите таблицу с полем типа объекта, например.

create table new_partners (pers person)

тогда доступ будет намного проще:

declare
  a_person person;
begin
  select p.pers into a_person
  from new_partners p 
  where p.pers.dni = 1;
end;

SQLFiddle

person ThinkJet    schedule 04.04.2014
comment
Спасибо. Подожду альтернатив. Миддлтайм, вы знаете, используют ли люди расширения объектов в неакадемических проектах? - person dani herrera; 04.04.2014
comment
В большинстве случаев расширения объектов используются очень ограниченно без наследования и методов, а только в качестве пользовательских структур хранения. В этом вопросе я согласен с этим ответом. Лично для меня основным фактором, останавливающим меня от использования объектов в ООП, является плохая поддержка изменений в структуре данных по сравнению с простыми реляционными таблицами с пакетами. Подумайте о добавлении нового поля в один из основных объектов. - person ThinkJet; 07.04.2014