Пау-чок
Дамы и господа, может ли кто-нибудь пролить свет на такую загадку?.. Стало интересно, каким образом в объектных таблицах Оракла хранятся объекты.
Немного конкретизирую, что же именно вызывает замешательство. А то, что следующий код:
===
===
Выдаёт вполне себе "1" и "Ы". А
===
===
выдаёт только:
===
===
Т.е. получается, что в таблице хранятся только поля родительского класса, поля же дочерних классов хранятся чёрт знает где...
Немного конкретизирую, что же именно вызывает замешательство. А то, что следующий код:
===
CREATE OR REPLACE TYPE "SomeType" AS OBJECT("f1" int) NOT FINAL;
/
CREATE OR REPLACE TYPE "SomeChld1" UNDER "SomeType"("f2" int);
/
CREATE OR REPLACE TYPE "SomeChld2" UNDER "SomeType"("f2" varchar2(128));
/
CREATE TABLE "SomeTable" OF "SomeType";
INSERT IGNORE INTO "SomeTable" VALUES(new "SomeType"(0));
INSERT IGNORE INTO "SomeTable" VALUES(new "SomeChld1"(1,1));
INSERT IGNORE INTO "SomeTable" VALUES(new "SomeChld2"(2,'Ы'));
DECLARE
var1 "SomeType";
var2 "SomeChld1";
var3 "SomeChld2";
BEGIN
SELECT VALUE(e) INTO var1 FROM "SomeTable" e WHERE e."f1" = 1;
var2 := TREAT(var1 AS "SomeChld1");
DBMS_OUTPUT.PUT_LINE(var2."f2");
SELECT VALUE(e) INTO var1 FROM "SomeTable" e WHERE e."f1" = 2;
var3 := TREAT(var1 AS "SomeChld2");
DBMS_OUTPUT.PUT_LINE(var3."f2");
END;
/
===
Выдаёт вполне себе "1" и "Ы". А
===
SELECT * FROM "SomeTable";
===
выдаёт только:
===
f1
----------
0
1
2
===
Т.е. получается, что в таблице хранятся только поля родительского класса, поля же дочерних классов хранятся чёрт знает где...