2012-12-20 48 views
0

我想動態解析光標的值,如下所示。動態解析到參考光標

create or replace 
PROCEDURE test(
PI_JANUS_ID IN VARCHAR2, 
PO_dummy out Types.CursorType 
)AS 
PO_ACTUALCUROSR Types.CursorType; 
cur_row tab%ROWTYPE; 
val1 varchar2(100); 
val2 varchar2(200); 
BEGIN 
open PO_ACTUALCUROSR for select * from tab; 

    LOOP 
    FETCH PO_ACTUALCUROSR into cur_row; 
    EXIT WHEN PO_ACTUALCUROSR%NOTFOUND; 
    val1 := 'TNAME'; 
    SELECT 'cur_row.'||val1 INTO val2 FROM DUAL; 
    dbms_output.put_line('Column Value ' || val2); 
    END LOOP ; 
    CLOSE PO_ACTUALCUROSR; 
END; 

這裏如果你看到我必須調用cur_row。獲取值,但在這裏我有一個變量(val1)的列名。那麼我將如何從光標處取得值。

如果我執行上述塊,我會看到「cur_row.TNAME」,但我實際上需要光標中的值。

有沒有辦法做到這一點。

任何幫助,非常感謝。

+0

我真的不明白這一點,因爲這兩個val1和val2的是你的過程中聲明的局部變量(有甚至沒有參數)那麼,爲什麼它們不能被直接列入「SELECT * FROM選項卡」查詢你的光標(PO_ACTUALCUROSR)在哪裏運行? – dariyoosh

+0

這只是我給出的一個例子,我的實際問題是我有一個遊標,但是我會知道在運行時從光標中選擇哪個列,只能從不同的表中選擇列名。 – lsiva

+0

另外要添加從我得到的光標的源表有550列。 – lsiva

回答

3

只是做

BEGIN 
open PO_ACTUALCUROSR for select * from tab; 

    LOOP 
    FETCH PO_ACTUALCUROSR into cur_row; 
    EXIT WHEN PO_ACTUALCUROSR%NOTFOUND; 
    val2 := cur_row.tname; 
    dbms_output.put_line(val2); 
    END LOOP ; 
    CLOSE PO_ACTUALCUROSR; 
end; 

dbms_output.put_line(cur_row.tname); 

直接也可以工作。

p.s.您的變量

val2 varchar2(200); 

是更好,因爲

val2 tab.tname%type; 

,如果你說你需要動態的列拉不知道列名的時間提前,你不得不使用動態SQL,和你'使用pl/sql數組時,我們需要將它放在包規範中,以便我們可以引用它(因爲不能將pl/sql類型傳遞到動態SQL中)。

SQL> create table tab(id number, col1 varchar2(10)); 

Table created. 

SQL> insert into tab values (1, 'a'); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> create package global_var 
    2 as 
    3 cur_row tab%rowtype; 
    4 end; 
    5/

Package created. 

SQL> declare 
    2 po_actualcurosr sys_refcursor; 
    3 val1 varchar2(10) := 'COL1'; 
    4 val2 tab.col1%type; 
    5 begin 
    6 open po_actualcurosr for select * from tab; 
    7 
    8  loop 
    9    fetch po_actualcurosr into global_var.cur_row; 
10    exit when po_actualcurosr%notfound; 
11    execute immediate 'begin :a := global_var.cur_row.'||dbms_assert.simple_sql_name(val1)||'; end;' using out val2; 
12    dbms_output.put_line(val2); 
13  end loop ; 
14  close po_actualcurosr; 
15 end; 
16/
a 

PL/SQL procedure successfully completed. 
+0

這是一個完美的答案。我的問題解決了。萬分感謝 – lsiva