36

ストアド プロシージャ (OUT 変数) から返された ref カーソルからフェッチし、結果の行を SQL*PLUS の STDOUT に出力するにはどうすればよいですか?

ORACLE ストアド プロシージャ:

PROCEDURE GetGrantListByPI(p_firstname IN VARCHAR2, p_lastname IN VARCHAR2,
p_orderby IN VARCHAR2, p_cursor OUT grantcur);

PL/SQL:

SET SERVEROUTPUT ON;

DECLARE
  TYPE r_cursor IS REF CURSOR;
  refCursor r_cursor;

  CURSOR grantCursor IS
    SELECT last_name, first_name
    FROM ten_year_pis
    WHERE year_added = 2010;

  last_name VARCHAR2(100);
  first_name VARCHAR2(100);

BEGIN
  OPEN grantCursor;
  FETCH grantCursor INTO last_name, first_name;

  WHILE grantCursor%FOUND LOOP
    PMAWEB_PKG.GetGrantListByPI(last_name, first_name, 'last_name', refCursor);

    --HOW DO I LOOP THROUGH THE RETURNED REF CURSOR (refCursor)
    --AND PRINT THE RESULTING ROWS TO STDOUT?

    FETCH grantCursor into last_name, first_name;
  END LOOP;
  CLOSE grantCursor;
END;
/
4

4 に答える 4

43

注: このコードはテストされていません

refCursor 戻り型のレコードを定義し、rec と呼びます。例えば:

TYPE MyRec IS RECORD (col1 VARCHAR2(10), col2 VARCHAR2(20), ...);  --define the record
rec MyRec;        -- instantiate the record

プロシージャから refcursor が返されたら、コメントがある場所に次のコードを追加できます。

LOOP
  FETCH refCursor INTO rec;
  EXIT WHEN refCursor%NOTFOUND;
  dbms_output.put_line(rec.col1||','||rec.col2||','||...);
END LOOP;
于 2011-04-28T17:39:14.120 に答える
19

これを行うには、SQLPlus レベルでバインド変数を使用できます。もちろん、出力のフォーマットはほとんど制御できません。

VAR x REFCURSOR;
EXEC GetGrantListByPI(args, :x);
PRINT x;
于 2011-04-28T17:46:35.913 に答える