Kann ich meinen Datentyp im Systemtyp verankern?


7

Der folgende Code:

create or replace type sqlids_t is table of sys.v_$sql.sql_id%type;

...gibt mir...

Error(2,31): PLS-00329: schema-level type has illegal reference to SYS.V_$SQL

Ich erhalte den gleichen Fehler beim Erstellen eines %objectoder %rowTyps.

Gibt es eine Möglichkeit, einen sys-Typ in meiner Typdefinition zu verwenden? Ich weiß, dass ich den Basiswert verwenden kann VARCHAR2(13), aber ich möchte ihn nach Möglichkeit vermeiden.

Antworten:


7

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

Da Oracle nicht weiß, was zu tun ist, müssen wir Typen erstellen, die eine weniger klare Absicht haben.
Noctis Skytower
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.