我可以将我的数据类型锚定到系统类型吗?

a1e*_*x07 7 oracle-10g

以下代码:

create or replace type sqlids_t is table of sys.v_$sql.sql_id%type;
Run Code Online (Sandbox Code Playgroud)

...给我...

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

我在创建%object%row类型时遇到相同的错误。

有什么办法可以在我的类型定义中使用 sys 类型吗?我知道我可以使用底层的VARCHAR2(13),但如果可能的话我想避免它。

Ste*_*enK 7

简短回答:不,你不能,也不是因为它是一种系统类型。您不能将独立类型锚定到任何表的列数据类型。

%TYPE 是一个 PL/SQL 结构。CREATE [OR REPLACE] TYPE 是 SQL。您不能在 SQL 中使用 %TYPE。

你不能这样做是有道理的。如果您在 PL/SQL 中使用 MYTABLE.MYCOLUMN%TYPE,则您已将该 PL/SQL 类型锚定到表中,如果 MYCOLUMN 的类型发生变化,PL/SQL 会使您的代码无效,然后重新编译它。如果您的示例有效,那么 Oracle 必须做什么就不太清楚了。

想象一下,如果您将 SQLID_T 的对象存储在一个表中,并且 V_$SQL 中 SQL_ID 的定义发生了变化,会发生什么。Oracle 是否需要更改存储对象的定义?如果不能(例如,SQL_ID 从 VARCHAR2 更改为 NUMBER)怎么办?这应该阻止 V_$SQL 的定义改变吗?或者使用该类型的表应该以某种方式变得无效......你不能再从中选择?

Oracle 试图防止这种事情发生(来自 Oracle 的对象关系开发人员指南):

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
Run Code Online (Sandbox Code Playgroud)