Oracle-10g

我可以將我的數據類型錨定到系統類型嗎?

  • May 16, 2012

以下程式碼:

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

引用自:https://dba.stackexchange.com/questions/17547