(Oracle) Как извлечь специализированную UDO из таблицы объектов на основе обобщенной UDO? - PullRequest
0 голосов
/ 15 декабря 2011

Я заранее прошу прощения за то, что не знал терминологию, но здесь это идет:

Как извлечь специализированный UDO (UDO = определенный пользователем объект & special =, который «расширяет» или находится «под» другим UDO), который я вставил в таблицу объектов, определенную для обобщенного UDO (обобщенный - выше в том же UDO иерархия).

Детали:

CREATE OR REPLACE TYPE GENERIC_UDO AS OBJECT (
    atribute_1 TYPE,
    ...
    atribute_n TYPE2, //TYPE2 is a nested table
) NOT FINAL NOT INSTANTIABLE;

CREATE OR REPLACE TYPE SPECIALIZED_UDO UNDER GENERIC_UDO (
    atribute_1 TYPE,
    ...
    atribute_q TYPE3, //TYPE3 is also a nested table
) FINAL INSTANTIABLE;

CREATE TABLE TBL_GENERIC_UDO OF GENERIC_UDO 
(  CONSTRAINT PK...)
... //other nested tables
NESTED TABLE atribute_n STORE AS atribute_n_nst;

Так что это работает: INSERT INTO TBL_GENERIC_UDO values (new TBL_GENERIC_UDO(...)); потому что TBL_GENERIC_UDO находится «под» GENERIC_UDO. 'select * from TBL_GENERIC_UDO' показывает мне в виде столбцов только атрибуты GENERIC_UDO (как и ожидалось!)

Итак, как мне извлечь или извлечь и преобразовать, потому что мне нужно прочитать обратно SPECIALIZED_UDO.

Я немного заплатил:

  • ЗНАЧЕНИЕ (x): SELECT VALUE(tgo) FROM TBL_GENERIC_UDO tgo;
  • TREAT (x как Y): SELECT TREAT(VALUE(tgo) as SPECIALIZED_UDO) FROM TBL_GENERIC_UDO tgo;

и хороших результатов нет. На самом деле в случаях стенда я получаю


  • SCHEMANAME.SPECIALIZED_UDO(values, values,..., null)
  • oracle.sql.STRUCT@54faa2

В первом случае, когда я выполнял вставку, значение corespondent для atribute_q было установлено равным нулю, во втором это было правильное значение, например: SPECIALIZED_UDO('value1','value1',...)

Я полагаю, это потому, что у TBL_GENERIC_UDO нет условия хранения для atribute_q из SPECIALIZED_UDO.

Так что кто-нибудь подумает, объяснения будут оценены.

1 Ответ

0 голосов
/ 16 декабря 2011

Решил сам!Разве это не было таким хардкорным, как я ожидал.Сначала я подумал, что Oracle будет «усекаться» при вставке специализированной UDO в таблицу, определенную для универсальной UDO, и в моем случае специализированная UDO имела дополнительно еще одну вложенную таблицу в качестве атрибута, но это не так.

Проверьте пример кода, последняя строка является самой важной:

CREATE OR REPLACE TYPE OBJ_TBL_TEXT IS TABLE OF VARCHAR2(100);

CREATE OR REPLACE TYPE OBJ_CONTAINER1 AS OBJECT (
    ATRIBUTE NUMBER(6),
    TBL_TEXT OBJ_TBL_TEXT
) NOT FINAL NOT INSTANTIABLE;

CREATE OR REPLACE TYPE OBJ_CONTAINER2 UNDER OBJ_CONTAINER1(
    SECOND_TBL_TEXT OBJ_TBL_TEXT
) FINAL INSTANTIABLE;

CREATE TABLE TBL_CONTAINER1 OF OBJ_CONTAINER1 
(  CONSTRAINT PK_TBL_CONTAINER1 PRIMARY KEY(ATRIBUTE))
NESTED TABLE TBL_TEXT STORE AS TBL_TEXT_NST;

INSERT INTO TBL_CONTAINER1 VALUES (NEW OBJ_CONTAINER2(1,null,null));
INSERT INTO TBL_CONTAINER1 VALUES (NEW OBJ_CONTAINER2(2,null, OBJ_TBL_TEXT('VAL1','VAL2')));
INSERT INTO TBL_CONTAINER1 VALUES (NEW OBJ_CONTAINER2(3,OBJ_TBL_TEXT('VAL3','VAL4'), null));
INSERT INTO TBL_CONTAINER1 VALUES (NEW OBJ_CONTAINER2(4,OBJ_TBL_TEXT('VAL5','VAL6'), OBJ_TBL_TEXT('VAL7','VAL8')));
--------------------------------------------------------------------------------

SELECT * FROM TBL_CONTAINER1;
SELECT VALUE(tc) FROM TBL_CONTAINER1 tc;
SELECT TREAT(VALUE(tc) as OBJ_CONTAINER2).SECOND_TBL_TEXT FROM TBL_CONTAINER1 tc;

При первом выборе в виде столбцов будут отображаться только атрибуты из OBJ_CONTAINER1, например:

ATTRIBUTE| TBL_TEXT
--===============--
- 1   (null)
- 2   (null)
- 3   VARCHAR(VAL3,VAL4)
- 4   VARCHAR(VAL5,VAL6)

Второй выглядит страннее

VALUE(TC)
--=====--
DATAMODELER.OBJ_CONTAINER2(1,null,null)
oracle.sql.STRUCT@57ac8e
oracle.sql.STRUCT@1df6f
oracle.sql.STRUCT@f40801

VALUE - возвращает экземпляр объекта для строки таблицы объектов, связанный с correlation_variable (псевдоним таблицы)

Третий один позволяет мне иметь доступ к вложенным атрибутам, не упомянутым во вложенном предложении при создании TBL_CONTAINER1.

TREAT(VALUE(tc) as OBJ_CONTAINER2).SECOND_TBL_TEXT
--==============================================--
(null)
VARCHAR(VAL1,VAL2)
(null)
VARCHAR(VAL7,VAL8)

Это именно то, что мне было нужно.Пока не знаю, как Oracle хранит дополнительные атрибуты, и все равно.Хоть бы поделиться решением ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...