2011-01-12 24 views
1

SQL Developerを使用してOracleストアド・プロシージャをコールしようとしています。 procはsys_refcursorを使用して結果を出力します。 procウィンドウを右クリックすると、Run PL/SQLウィンドウが表示されます。私はprocを選択するとき、私はそれが私のためのすべての入力パラメータなどを作成したい。以下は、sys_refcursorをループして結果を出力しようとするコードですが、 'v_rec v_Return%rowtype;'にエラーが発生しています。 PLS-00320:この式のタイプの宣言は不完全であるか、または形式が正しくありません。PLS-00320:この式のタイプの宣言は、完全ではありません。 ORA-06550:行6列9: PL/SQL:項目はSQL Developerからのストアド・プロシージャの出力結果

ベンダーコード6550

を無視し、私は他のウェブサイトのカップルにループのコードを発見し、それを行うための方法のようですが、私が何を試しても、それは私のために働いていません。 DBMS_OUTPUT.PUT_LINE( 'name =' || v_rec.ADM)に関するもう1つの質問は、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の%の行型がv_recを宣言するための有効なレコード構造ではないので、具体的な構造(列のリストを)持っていません。プロシージャへの異なる呼び出しによって、異なる構造のカーソルを戻すことも可能です。

返されるカーソルの構造が(Oracleではなく)どのような構造であるかがわかっているので、適切なレコード構造を明示的に定義する必要があります。

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

あなたは、%ROWTYPEとしてそれを定義することができるように、強く型付けされたREFカーソルを必要としています。それは私が間違っているつもりだったより良いアイデアを与えた。このため

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から直接コピーしたので、出力構造体の他のすべてのフィールドが正しいと確信しています。