带有dba对象的表类型

时间:2017-04-08 17:42:53

标签: oracle plsql user-defined-types

为什么我们无法使用以下代码创建对象。

create or replace type typ_obj_dba_test as object (name_col 
                  dba_objects.object_name%type); 

它告诉我必须声明object_name。

是因为dba_objects是一个视图吗?

1 个答案:

答案 0 :(得分:1)

  

"是因为dba_objects是一个视图吗?"

没有。您也无法使用表格列来执行此操作。 %TYPE语法仅限于PL / SQL,您正在创建SQL TYPE,而不是PL / SQL。

这种限制令许多开发人员感到烦恼,特别是那些来自更动态编程语言背景的开发人员。但问题是%TYPE语法动态的:如果引用的列更改其数据类型,则引用对象会发生更改。

当我们在存储过程中声明变量或参数时,这很简洁。但我们可以使用SQL类型来定义表列(*)。将一列中的更改级联到引用它的who-know-how-many列将是一场噩梦。所以Oracle不允许我们这样做。

我担心您需要使用显式数据类型声明:

create or replace type typ_obj_dba_test as object (
   name_col varchar2(30)
 );

(*)通常不建议在表定义中使用Types,但Oracle支持ORDBMS数据结构。