2011-04-28 100 views
29

如何從存儲過程(OUT變量)返回的引用遊標中獲取並在SQL * PLUS中將結果行打印到STDOUT中?由存儲過程返回的PL/SQL打印輸出遊標

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

回答

35

注:此代碼是未經測試

定義記錄您的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; 
+0

的問題是,所述存儲過程返回一個引用遊標作爲兩個表之間的聯接結果。如何引用連接表的返回類型? – elpisu 2011-04-28 18:15:41

+2

你需要知道你的光標在類型和大小方面是什麼,才能理解它。使用連接中的字段定義一條記錄,並將這些行提取到記錄中。 – DCookie 2011-04-28 20:07:27

+0

謝謝@DCookie,但如果我必須從每一行只讀取一列,那麼我可以做什麼。我是否需要創建整個結構? – 2012-10-17 08:50:47

17

您可以在SQLPlus級別使用綁定變量做這個。當然,你對輸出格式的控制很少。

VAR x REFCURSOR; 
EXEC GetGrantListByPI(args, :x); 
PRINT :x; 
2

如果要打印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; 

希望這給你一個替代的解決方案

相關問題