Kurze Antwort: Nein, das können Sie nicht und nicht, weil es sich um einen Systemtyp handelt. Sie können einen freistehenden Typ nicht im Spaltendatentyp einer Tabelle verankern.
% TYPE ist ein PL / SQL-Konstrukt. CREATE [OR REPLACE] TYPE ist SQL. Sie können% TYPE in SQL nicht verwenden.
Es macht etwas Sinn, dass Sie nicht können. Wenn Sie MYTABLE.MYCOLUMN% TYPE in PL / SQL verwenden, haben Sie diesen PL / SQL-Typ in der Tabelle verankert. Sollte sich der Typ MYCOLUMN ändern, kann PL / SQL Ihren Code ungültig machen und ihn dann neu kompilieren. Es ist viel weniger klar, was Oracle tun müsste, wenn Ihr Beispiel funktionieren würde.
Stellen Sie sich vor, was passieren würde, wenn Sie Objekte von SQLID_T in einer Tabelle speichern und die Definition von SQL_ID in V_ $ SQL ändern würde. Müsste Oracle die Definition der gespeicherten Objekte ändern? Was ist, wenn dies nicht möglich ist (z. B. wurde SQL_ID von VARCHAR2 in NUMBER geändert)? Sollte dies verhindern, dass sich die Definition von V_ $ SQL ändert? Oder sollte die Tabelle, die diesen Typ verwendet hat, auf irgendeine Weise ungültig werden ... Sie können nicht mehr daraus AUSWÄHLEN?
Oracle versucht, dies zu verhindern ( siehe Oracle's Object-Relational Developer's Guide ):
SQL> CREATE OR REPLACE TYPE t1 FORCE AS OBJECT (c varchar(20));
2 /
Type created.
SQL> CREATE TABLE tb1 (c1 t1);
Table created.
SQL> CREATE OR REPLACE TYPE t1 FORCE AS OBJECT (d number);
2 /
CREATE OR REPLACE TYPE t1 FORCE AS OBJECT (d number);
*
ERROR at line 1:
ORA-22866: cannot replace a type with table dependents