PL/SQL распечатать курсор ref, возвращенный хранимой процедурой
Как я могу извлечь из курсора ref, который возвращается из хранимой процедуры (переменная 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;
/
Ответы
Ответ 1
Примечание. Этот код не проверен
Определите запись для возвращаемого типа 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;
Ответ 2
Для этого вы можете использовать переменную связывания на уровне SQLPlus. Конечно, вы не можете контролировать форматирование вывода.
VAR x REFCURSOR;
EXEC GetGrantListByPI(args, :x);
PRINT :x;
Ответ 3
Если вы хотите распечатать все столбцы в предложении 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;
Надеюсь, это даст вам альтернативное решение