2016-09-27 62 views
0

我想写一个存储函数返回一个数组rowid。我做的第一件事是创建TABLE类型rowid写一个存储函数返回一个rowid数组

CREATE OR REPLACE TYPE T_ROWID_ARRAY IS TABLE OF ROWID; 

但是,显示以下错误消息:

PLS-00531: Unsupported type in a VARRAY or TABLE type: 'ROWID'. 

一些google搜索后,它看起来像甲骨文11gR2的不允许创建table类型的rowid

那么是否有任何解决方法,以便我可以编写一个存储的函数来返回多个rowid(s)?

我希望通过写像下面以简化我的SQL:

SELECT * FROM TABLE_A WHERE ROWID IN (SELECT COLUMN_VALUE FROM GET_ROW_IDS('A', 'B', 'C')); 
+0

ROWID在Oracle中不是有效的数据类型。它是一个伪列,它在数据库中表示记录所在磁盘上的物理位置。使用varchar2类型的集合来存储rowid CREATE OR REPLACE TYPE T_ROWID_ARRAY IS TABLE OF VARCHAR2(100); –

+0

@PrashantMishra:ROWID甚至是一个数据类型,但它不能用于创建表格 – Aleksej

+0

@ Aleksej - 你是对的......我错过了它。它也是一个数据类型。并且我们可以在表格中列出它: SQL> create table test(t rowid); Table created 0.613秒执行 它只接受rowid: SQL>插入测试值('AAAAB0AABAAAAOhAAA'); 插入1行 在0.578秒内执行 SQL>插入测试值('123'); 插入测试值('123') ORA-01410:无效的ROWID –

回答

1

的一种方法可以在ROWID被转换为VARCHAR,返回VARCHAR2的表,然后将它们转换回ROWID类型。 例如:

SQL> declare 
    2  v varchar2(100); 
    3  n number; 
    4 begin 
    5  select ROWIDTOCHAR(rowid) 
    6  into v 
    7  from dual; 
    8  -- 
    9  dbms_output.put_line('ROWID varchar: ' || v); 
10  -- 
11  select count(1) 
12  into n 
13  from dual 
14  where rowid = CHARTOROWID(V); 
15  -- 
16  dbms_output.put_line('Found rows: ' || n); 
17 end; 
18/
ROWID varchar: AAAAB0AABAAAAOhAAB 
Found rows: 1 

PL/SQL procedure successfully completed. 
0

您是否特别需要独立的SQL数组类型?如果你把事情纯粹地保留在PL/SQL中,它应该没问题(在11.2.0.4中测试):

declare 
    type rowidtable is table of rowid; 
    t rowidtable; 
begin 
    select rowid bulk collect into t from dual; 
    dbms_output.put_line('t(1) contains ' || t(1)); 
end; 
/

t(1) contains AAAAB0AABAAAAEbAAA 

PL/SQL procedure successfully completed.