1

SQLDeveloperを使用してOracleストアドプロシージャを呼び出そうとしています。procは、sys_refcursorを使用して結果を出力します。procウィンドウを右クリックすると、Run PL/SQLウィンドウが表示されます。必要なプロシージャを選択すると、すべての入力パラメータなどが作成されます。以下は、sys_refcursorをループして結果を出力するために使用しているコードですが、「v_rec v_Return%rowtype;」でエラーが発生します。ライン :

ORA-06550:6行目9列目:PLS-00320:この式の型の宣言が不完全であるか、形式が正しくありません。ORA-06550:行6、列9:PL / SQL:項目は無視されます

ベンダーコード6550

他のいくつかのWebサイトでループコードを見つけました。これを行う方法のようですが、何を試しても機能しません。別の質問-DBMS_OUTPUT.PUT_LINE('name ='|| v_rec.ADM)で、v_recを正しく参照していますか?つまり、v_rec。"column_name"は正しい方法ですか??

私はOracleにそれほど慣れておらず、SQLplusを使用したことがありません。任意の提案をいただければ幸いです。

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

3 に答える 3

4

あなたの問題はここにあります:

v_Return sys_refcursor;
v_rec v_Return%rowtype;

v_Returnはカーソル変数であり、特定の構造(列のリスト)がないため、v_Return%rowtypeはv_recを宣言するための有効なレコード構造ではありません。プロシージャへのさまざまな呼び出しで、さまざまな構造のカーソルを返すことも可能です。

返されるカーソルの構造が何であるかを知っているので(ただし、Oracleはそうではありません)、適切なレコード構造を明示的に定義する必要があります。

type t_row is record (empno number, ename varchar2(30));
v_rec t_row;
于 2011-01-12T10:10:45.130 に答える
3

%ROWTYPEとして定義できるようにするには、強く型付けされたrefカーソルが必要です。

ここの例

于 2011-01-12T10:14:45.333 に答える
0

@Tony Andrewsはこれに感謝し、どこが間違っているのかをよりよく理解することができました。それでもまだ問題があります-これが私の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

「rownumrnum、v_total_count」の部分が私をつまずかせているのではないかと思っています。procから直接コピーしたので、出力構造の他のすべてのフィールドが正しいと確信しています。

于 2011-01-13T10:39:02.330 に答える