编写存储函数以返回rowid数组

时间:2016-09-27 08:55:51

标签: oracle plsql

我正在尝试编写一个存储函数来返回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'));

2 个答案:

答案 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.