2012-12-20 45 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