2012-11-12 33 views
1

比方說,我有這樣的構建物的PLSQL過程中:甲骨文弱類型的記錄作爲參數

... 
for rec in 
    (
    select a, b, c from t; 
) 
loop 
    process_record(rec); 
end loop; 
... 

procedure process_record(p_rec in ???) 
... 

我如何通過REC,這是一個弱類型遊標的記錄,以進行處理的過程。 我不想爲這種類型的記錄定義遊標和類型。 這可能嗎?

TIA 黃金

回答

0

你必須定義一個指針,或類(既沒有必要),以告訴甲骨文輸入的結構(除非你想往下走的路線或定義AnyDATA公司/ 。ANYTYPE方法

declare 
    cursor my_template 
    is 
    select a,b,c from t; 


    procedure process_record(p_rec in my_template%rowtype) 
     is 
    begin 
    null; 
    end; 
begin 
for rec in 
    (
    select a, b, c from t 
) 
loop 
    process_record(rec); 
end loop; 
end; 
/
+0

是的,這是傳遞TYPED記錄的常規方法。我特別要求一種避免打印記錄的方法。不管怎麼說,還是要謝謝你。 –

+0

這就是爲什麼我說唯一的方法是ANYDATA/ANYTYPE。但它有很多代碼。你不能讓程序接受一個sys_refcursor嗎? – DazzaL

+0

不可以。有一箇中央過程使用for..in()循環讀取記錄。目前所有的記錄處理都是在循環體中完成的。身體變得非常大,我想把它分成幾個程序 - 重構它。循環內的記錄看起來像一個無類型的記錄。我希望這個記錄可以傳遞給一個處理過程,而不是在循環體內使用它。 –

0

我不知道一個簡單的方法來向(而且是最驚訝地看到一個),但我有一個解決辦法:

使用的XMLType爲你的類型:

declare 

begin 
    for rec in (select xmlelement("p_rec", xmlforest(a, b, c)) r from t) loop 
    process_record(rec.r); 
    end loop; 
end; 

...

create or replace procedure process_record(p_rec in XMLtype) as 

BEGIN 
dbms_output.put(p_rec.extract('//A/text()').getstringval() || ','); 
dbms_output.put(p_rec.extract('//B/text()').getstringval() || ','); 
dbms_output.put_line(p_rec.extract('//C/text()').getstringval()); 
END; 

順便說一句,你爲什麼要這麼做?

+0

有趣,但我希望能夠使我能夠直接在process_record過程中使用rec.a ......這有點複雜,我猜想執行速度慢。不是,這是一個有效的答案(我沒有嘗試這個我自己)。非常感謝你。 –