2012-08-12 91 views
0

我有一個IN OUT參數和一個參考光標作爲存儲過程的返回值。目前我正在做下面的事情。Oracle參考光標以及輸出參數

create table dept 
(dept_id number, 
    name varchar2(40), 
    location varchar2(200) 
); 

CREATE OR REPLACE PACKAGE HR.SP_PACKAGE AS 

    TYPE dept_type IS REF CURSOR RETURN HR.dept%ROWTYPE; 

END SP_PACKAGE; 

CREATE OR REPLACE PROCEDURE HR.MIXED_IN_INOUT_REF_PARAM 
(
    P_ID IN NUMBER 
, P_NAME_TO_LOCATION IN OUT VARCHAR2 
, P_RCURSOR OUT SP_PACKAGE.dept_type 
) AS 
BEGIN 
    SELECT name INTO P_NAME_TO_LOCATION FROM HR.dept WHERE dept_id = p_id AND name = P_NAME_TO_LOCATION; 
    OPEN P_RCURSOR FOR 
     select * 
     from HR.dept; 
END MIXED_IN_INOUT_REF_PARAM; 

即使編譯成功,我在運行時遇到了一些錯誤。

ORA-06550: line 4, column 17: 
PLS-00201: identifier 'CURSOR' must be declared 
ORA-06550: line 4, column 13: 
PL/SQL: Item ignored 
ORA-06550: line 12, column 18: 
PLS-00320: the declaration of the type of this expression is incomplete or malformed 
ORA-06550: line 9, column 3: 
PL/SQL: Statement ignored 
ORA-06550: line 21, column 17: 
PLS-00320: the declaration of the type of this expression is incomplete or malformed 
ORA-06550: line 21, column 3: 
PL/SQL: Statement ignored 

我正在使用Sql Developer。任何幫助表示讚賞。

+0

你確定它們都是創建和編譯的請重新確認 – shareef 2012-08-12 09:02:12

+0

包定義中有一個小問題。通過刪除數據庫限定符(例如:CREATE OF REPLACE PACKAGE SP_PACKAGE AS ..)來解決這個問題。現在他們都編譯和打包,程序顯示爲已創建。 – chamibuddhika 2012-08-12 14:08:09

+1

請編輯你的文章,幷包含發出調用PL/SQL過程的代碼。謝謝。 – 2012-08-12 15:13:08

回答

0

改變這樣 刪除return

CREATE OR REPLACE PACKAGE HR.SP_PACKAGE AS 

    TYPE dept_type IS REF CURSOR ; 

END SP_PACKAGE; 

你可以把它更加動態的思想這樣

open p_cursor FOR 'SELECT * FROM DEPT where ' || V_WHERE; 
+0

我嘗試刪除沒有運氣的回報。 :(你的第二個建議能幫助我解決上述問題嗎?我不知道我完全理解了這一點,對V_WHERE參數感到困惑,如果這些都是微不足道的問題,只需從Oracle開始吧:)。 – chamibuddhika 2012-08-12 14:12:16

0

沒有您PROC chamibuddhika沒有問題,我認爲有一些問題你怎麼稱呼它。我試着創建相同的程序,它運行良好。.try來運行你的程序,如下所示:

declare 
v_temp varchar2(200):='ACCOUNTING'; 
rec SP_PACKAGE.dept_type; 
v_rec rec%ROWTYPE; 

begin 
MIXED_IN_INOUT_REF_PARAM(10,v_temp,rec); 

LOOP 
FETCH rec INTO v_rec; 
EXIT WHEN rec%NOTFOUND; 
dbms_output.put_line(v_rec.name); 

END LOOP; 

end; 

輸出

ACCOUNTING 
RESEARCH 
SALES 
OPERATIONS 

有一個問題與你的PROC,裏面的時候PROC查詢不返回任何東西,它會exception.So你需要處理,在你的進程內給你no_data_found