PL / SQL распечатывает ref курсор, возвращаемый хранимой процедурой - PullRequest
32 голосов
/ 28 апреля 2011

Как извлечь из курсора ссылки, возвращенного из хранимой процедуры (переменная OUT), и вывести полученные строки в STDOUT в SQL * PLUS?

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

Ответы [ 3 ]

39 голосов
/ 28 апреля 2011

Примечание: этот код не проверен

Определите запись для вашего типа возврата refCursor, назовите его rec.Например:

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

После того, как вы вернули рекурсор из вашей процедуры, вы можете добавить следующий код, где ваши комментарии сейчас:

LOOP
  FETCH refCursor INTO rec;
  EXIT WHEN refCursor%NOTFOUND;
  dbms_output.put_line(rec.col1||','||rec.col2||','||...);
END LOOP;
17 голосов
/ 28 апреля 2011

Для этого можно использовать переменную связывания на уровне SQLPlus.Конечно, вы мало контролируете форматирование вывода.

VAR x REFCURSOR;
EXEC GetGrantListByPI(args, :x);
PRINT :x;
5 голосов
/ 19 марта 2014

Если вы хотите напечатать все столбцы в предложении select, вы можете воспользоваться командой autoprint.

CREATE OR REPLACE PROCEDURE sps_detail_dtest(v_refcur OUT sys_refcursor)
AS
BEGIN
  OPEN v_refcur FOR 'select * from dummy_table';
END;

SET autoprint on;

--calling the procedure
VAR vcur refcursor;
DECLARE 
BEGIN
  sps_detail_dtest(vrefcur=>:vcur);
END;

Надеюсь, это даст вам альтернативное решение

...