使用rowid属性创建对象类型

时间:2017-03-20 15:33:54

标签: oracle object oracle11g ddl rowid

我正在尝试使用 $ ./simple_exec 0 1 2 3 5 5 6 6 9 91 233 353 557 723 3553 4576 数据类型创建一个类型,但由于我尝试使用的类型,我收到此错误:

rowid

即使我可以创建一个包含rowid数据类型的表:

SQL> CREATE TYPE join_t IS OBJECT (inn  rowid,    out rowid ); 
/

Warning: Type created with compilation errors.

是否可以使用rowid-type属性创建上面的SQL> create table test_rowid (inn rowid,out rowid); Table created. 类型?

1 个答案:

答案 0 :(得分:3)

不,您无法创建包含rowid字段的对象类型。如果您通过user_errors视图或SQL * Plus命令show errors查看引发的实际错误,您将看到:

LINE/COL ERROR
-------- ------------------------------------------------------------------------------
1/28     PLS-00530: Illegal type used for object type attribute: 'ROWID'.
1/39     PLS-00530: Illegal type used for object type attribute: 'ROWID'.

The documenation says

  

数据类型的限制

     
      
  • 您不能对属性强加NOT NULL约束。
  •   
  • 您无法指定ROWID,LONG或LONG RAW类型的属性。
  •   
  • 您无法为ADT指定UROWID的数据类型   ...
  •   

作为一种变通方法,您可以在对象中使用字符串类型,并在设置时通过rowidtocharchartorowid函数将值转换为获取字段值:

CREATE TYPE join_t IS OBJECT (inn varchar2(18), out varchar2(18) );
/

Type JOIN_T compiled

SELECT join_t(rowidtochar(rowid), rowidtochar(rowid)) FROM DUAL;

JOIN_T(ROWIDTOCHAR(ROWID),ROWIDTOCHAR(ROWID))(INN, OUT)
-------------------------------------------------------
JOIN_T('AAAAB0AABAAAAOhAAA', 'AAAAB0AABAAAAOhAAA')

将rowid存储在对象中似乎并不特别有用,因为它们可以更改。