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 に答える