我正在尝试编写一个存储函数来返回rowid
数组。我要做的第一件事是通过以下方式为TABLE
创建rowid
类型:
CREATE OR REPLACE TYPE T_ROWID_ARRAY IS TABLE OF ROWID;
但是,会显示以下错误消息:
PLS-00531: Unsupported type in a VARRAY or TABLE type: 'ROWID'.
经过一些谷歌搜索后,看起来Oracle 11gR2不允许创建table
类型的rowid
。
那么是否有任何解决方法以便我可以编写一个存储函数来返回多个rowid?
我希望通过以下编写来简化我的SQL:
SELECT * FROM TABLE_A WHERE ROWID IN (SELECT COLUMN_VALUE FROM GET_ROW_IDS('A', 'B', 'C'));
答案 0 :(得分: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.
答案 1 :(得分: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.