动态解析引用游标

时间:2012-12-20 22:48:26

标签: oracle plsql

我正在尝试动态解析游标中的值,如下所示。

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”,但实际上我需要光标中的值。

有没有办法做到这一点。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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.