Дамы и господа, может ли кто-нибудь пролить свет на такую загадку?.. Стало интересно, каким образом в объектных таблицах Оракла хранятся объекты.
Немного конкретизирую, что же именно вызывает замешательство. А то, что следующий код:
===
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

===

Т.е. получается, что в таблице хранятся только поля родительского класса, поля же дочерних классов хранятся чёрт знает где...