2013-10-04 86 views
0

我有一個存儲過程,我從一組記錄(費用)中填充表格,然後將這些行放入參考光標中。將記錄傳遞給參考光標

TYPE rctl IS REF CURSOR ; 
Fees t_Fees; 
type t_Fees is table of t_FeeRecord index by binary_integer; 

type t_FeeRecord is record(
    description   varchar2(80), 
    amount    number(12,2), 
    taxAmount   number(12,2) 
); 

--populate the Fees array 

INSERT into TEMPORARY_FEE(description,amount,tax) values(Fees(i).description,Fees(i).Amount,Fees(i).Tax); 

OPEN rc1 FOR SELECT description,amount TEMPORARY_FEES; 

這一切工作正常(填充記錄,插入到臨時表和填充裁判光標),但有可能消除表,只是直接通過我的記錄陣列進ref_cursor?我必須將結果作爲ref_cursor返回給第三方應用程序。

我想我可能會嘗試這樣的事情。

OPEN rc1 FOR 
SELECT * FROM TABLE(cast(Fees as t_FeeRecord)); 

但我得到一個無效的數據類型。

+0

與包中定義的類型不同,因爲PL/SQL類型不能在SQL中使用(即使該SQL本身在PL/SQL中)。你的轉換也是錯誤的,'table()'不能對記錄類型進行操作。如果't_fees'在SQL級別用'create type'聲明,那麼你可以只從表格(費用)中選擇*。這是可行的嗎? –

回答

1

中的Oracle PL/SQL類型不能在SQL查詢中使用聲明t_FeeRecordt_Fees數據庫對象,而不是PL/SQL對象,
,這給你的數據類型錯誤(不過,這種限制是Oracle 12c中刪除)。

t_FeeRecord必須創建爲對象類型,而不是記錄類型,因爲記錄是PL/SQL類型,不能在SQL查詢中使用。

create type t_FeeRecord is object(
    description   varchar2(80), 
    amount    number(12,2), 
    taxAmount   number(12,2) 
);/ 

create type t_Fees as table of t_FeeRecord;/

下面是一個簡單的演示創建的記錄的表中,打開一個引用遊標此表並讀取光標並插入從光標檢索的行表(上11.2克測試):

create type t_FeeRecord is object(
    description   varchar2(80), 
    amount    number(12,2), 
    taxAmount   number(12,2) 
); 
/

create type t_Fees as table of t_FeeRecord; 
/

create table temporary_fee(
    description varchar2(80), 
    amount  number(12,2), 
    taxAmount number(12,2) 
); 

declare 
    fees t_Fees; 
    TYPE rctl IS REF CURSOR; 
    cur rctl; 

    rec TEMPORARY_FEE%ROWTYPE; 
begin 
    fees := t_Fees (
     t_FeeRecord('aaa', 20, 30), 
     t_FeeRecord('bbb', 10, 76), 
     t_FeeRecord('xxx', 4, 23), 
     t_FeeRecord('zzz', 7, 43), 
     t_FeeRecord('ccc', 13, 44)); 

    open cur for 
     select * from table(fees); 

    LOOP 
    FETCH cur INTO rec; 
    EXIT WHEN cur%NOTFOUND; 
    INSERT INTO TEMPORARY_FEE VALUES rec; 
    END LOOP; 
    close cur; 
end; 
/

select * from temporary_fee; 

DESCRIPTION  AMOUNT TAXAMOUNT 
------------ ---------- ---------- 
aaa     20   30 
bbb     10   76 
xxx     4   23 
zzz     7   43 
ccc     13   44 
+0

完美...謝謝 – EvilEddie