以下代码:
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),但如果可能的话我想避免它。
简短回答:不,你不能,也不是因为它是一种系统类型。您不能将独立类型锚定到任何表的列数据类型。
%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)
| 归档时间: |
|
| 查看次数: |
2506 次 |
| 最近记录: |