Oracle-10g
我可以將我的數據類型錨定到系統類型嗎?
以下程式碼:
create or replace type sqlids_t is table of sys.v_$sql.sql_id%type;
…給我…
Error(2,31): PLS-00329: schema-level type has illegal reference to SYS.V_$SQL
創建
%object
或%row
類型時出現相同的錯誤。有什麼方法可以在我的類型定義中使用 sys 類型?我知道我可以使用底層
VARCHAR2(13)
,但如果可能的話我想避免它。
簡短的回答:不,你不能,不是因為它是一種系統類型。您不能將獨立類型錨定到任何表的列數據類型。
%TYPE 是一個 PL/SQL 結構。創建
$$ OR REPLACE $$類型是 SQL。您不能在 SQL 中使用 %TYPE。 你不能這樣做是有道理的。如果您在 PL/SQL 中使用 MYTABLE.MYCOLUMN%TYPE,則您已將該 PL/SQL 類型錨定到表中,並且如果 MYCOLUMN 的類型發生更改,PL/SQL 會使您的程式碼無效,然後重新編譯它。如果您的範例有效,那麼 Oracle 必須做什麼就不太清楚了。
想像一下,如果您將 SQLID_T 的對象儲存在一個表中,並且 SQL_ID 的定義在 V_ 中會發生什麼 $ SQL changed. Would Oracle need to change the definition of the stored objects? What if it couldn’t (e.g, SQL_ID was changing from a VARCHAR2 to a NUMBER)? Should that prevent the definition of V_ $ SQL 從改變?或者使用該類型的表是否應該以某種方式變得無效……你不能再從中選擇?
Oracle 試圖防止這種事情發生(來自 Oracle 的 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