2016-09-27 61 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.