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

有没有办法做到这一点。

很感谢任何形式的帮助。

4

1 回答 1

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);

直接也可以。

ps你的变量

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.
于 2012-12-21T11:04:31.293 回答