2011-01-12 290 views
1

我想使用SQL Developer調用Oracle存儲過程。 proc使用sys_refcursor輸出結果。我右鍵單擊進入運行PL/SQL窗口的proc窗口。當我選擇proc時,我希望它爲我創建所有輸入參數等。下面是我用來通過sys_refcursor循環並輸出結果的代碼,但是我在'v_rec v_Return%rowtype'中得到一個錯誤;'行:來自SQL Developer的Oracle存儲過程的輸出結果

ORA-06550:第6行第9列: PLS-00320:此表達式類型的聲明不完整或格式錯誤。 ORA-06550:行6列9: PL/SQL:項目被忽略

供應商代碼6550

我發現一對夫婦的其他網站上的循環代碼,它似乎是做到這一點的方式,但無論我嘗試什麼,它都不適合我。另一個問題 - 關於DBMS_OUTPUT.PUT_LINE('name ='|| v_rec.ADM),我是否正確引用了v_rec,即v_rec。「column_name」的正確方法?

我不是那種習慣於Oracle並從未使用SQL plus的人。任何建議感激。

DECLARE 
    P_CAE_SEC_ID_N NUMBER; 
    P_PAGE_INDEX NUMBER; 
    P_PAGE_SIZE NUMBER; 
    v_Return sys_refcursor; 
    v_rec v_Return%rowtype; 
BEGIN 
    P_CAE_SEC_ID_N := NULL; 
    P_PAGE_INDEX := 0; 
    P_PAGE_SIZE := 25; 

    CAE_FOF_SECURITY_PKG.GET_LIST_FOF_SECURITY(
    P_CAE_SEC_ID_N => P_CAE_SEC_ID_N, 
    P_PAGE_INDEX => P_PAGE_INDEX, 
    P_PAGE_SIZE => P_PAGE_SIZE, 
    P_FOF_SEC_REFCUR => v_Return 
); 
    -- Modify the code to output the variable 
    -- DBMS_OUTPUT.PUT_LINE('P_FOF_SEC_REFCUR = '); 
    loop 
    fetch v_Return into v_rec; 
    exit when v_Return%notfound; 
    DBMS_OUTPUT.PUT_LINE('name = ' || v_rec.ADM); 
    end loop; 

END; 

回答

4

你的問題是在這裏:

v_Return sys_refcursor; 
v_rec v_Return%rowtype; 

V_RETURN是一個遊標變量並沒有具體的結構(列的列表),所以V_RETURN%ROWTYPE不是一個有效的記錄結構來聲明v_rec。對過程的不同調用甚至有可能返回具有不同結構的遊標。

你知道你期待返回光標的結構是(但甲骨文沒有),所以你需要例如明確定義相應的記錄結構

type t_row is record (empno number, ename varchar2(30)); 
v_rec t_row; 
3

您需要一個強類型的引用光標才能將其定義爲%ROWTYPE。

here

0

@Tony安卓感謝,它給了我一個更好的主意,我要去哪裏錯了。雖然仍然有問題 - 這是我的proc的縮短版本。這是一個有點複雜的,它的選擇從一個子查詢各個領域和其他2個值:

open p_fof_sec_refcur for  

SELECT * 
FROM( 
    SELECT securities.*, rownum rnum, v_total_count 
    FROM 
     (
     SELECT 
      CFS.CAE_SEC_ID, 
      CFS.FM_SEC_CODE, 
      ... 
     FROM 
     CAEDBO.CAE_FOF_SECURITY CFS 
     INNER JOIN caedbo.CAE_DATA_SET_ELEMENT CDSE_STAT 
      ON (CDSE_STAT.DATA_SET_ELEMENT_ID = CFS.APPR_STATUS) 
     ... 
     WHERE APPR_STATUS = NVL(p_appr_status, APPR_STATUS) 
     ... 
     )securities 
    ) 

    WHERE rnum between v_pgStart and v_pgEnd; 

我明確定義爲低於輸出結構,以匹配來自PROC回場,但我仍然得到一個錯誤:

v_Return sys_refcursor; 
type t_row is record (CAE_SEC_ID NUMBER,FM_SEC_CODE VARCHAR2(7),...rnum number, v_total_count number); 
v_rec t_row; 

我得到的錯誤是

ORA-06504: PL/SQL: Return types of Result Set variables or query do not match 
ORA-06512: at line 45 

我只是想知道的是 「ROWNUM RNUM,v_total_count」 部分絆倒了我。我敢肯定,我在輸出結構中的所有其他字段都是正確的,因爲我直接從proc中複製它們。