sql >> データベース >  >> RDS >> Oracle

ORA-00932:データ型に一貫性がありません:expected-got-

    REFCURSORの使用方法は一般的ではありません。これがそれらの標準的な使用方法です:

    SQL> CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
      2     PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
      3     BEGIN
      4        OPEN r_cursor FOR SELECT e.empno,e.ENAME,null  FROM scott.emp e;
      5     END MY_PROC;
      6  END MYPACK_PKG;
      7  /
    
    Corps de package crÚÚ.
    
    SQL> VARIABLE r REFCURSOR
    SQL> BEGIN
      2     MYPACK_PKG.MY_PROC(:r);
      3  END;
      4  /
    
    ProcÚdure PL/SQL terminÚe avec succÞs.
    
    SQL> PRINT :r
    
         EMPNO ENAME      N
    ---------- ---------- -
          7369 SMITH
          7499 ALLEN
          7521 WARD
          7566 JONES
          7654 MARTIN
          [...]
    
    14 ligne(s) sÚlectionnÚe(s).
    

    ここで何を達成しようとしているのかわかりません。プロシージャ内で参照カーソルをフェッチしてから、同じデータを持つ別の参照カーソルを返します。プロシージャでカーソルをフェッチする必要はまったくないと思います。呼び出し元のアプリにフェッチを実行させます(ここでは、フェッチはprintによって実行されます) 。

    更新:役に立たないエラーメッセージが表示されるのはなぜですか?

    動的に開いたカーソルを使用していますが、それが役に立たないエラーメッセージが表示される理由の一部だと思います。固定SQLを使用する場合、エラーメッセージは異なります。

    SQL> CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
      2     PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
      3        TYPE type_rec IS RECORD (qn number,
      4                                 firstname VARCHAR2(30),
      5                                 lastname VARCHAR2(30));
      6        lt_record type_rec; /* Record type */
      7        lt_object r_type; /* SQL Object type */
      8     BEGIN
      9        OPEN r_cursor FOR SELECT e.empno,e.ENAME,null  FROM scott.emp e;
     10        FETCH r_cursor INTO lt_record; /* This will work */
     11        FETCH r_cursor INTO lt_object; /* This won't work in 10.2 */
     12     END MY_PROC;
     13  END MYPACK_PKG;
     14  /
    
    Package body created
    
    SQL> VARIABLE r REFCURSOR
    SQL> BEGIN
      2     MYPACK_PKG.MY_PROC(:r);
      3  END;
      4  /
    BEGIN
    *
    ERREUR Ó la ligne 1 :
    ORA-06504: PL/SQL: Return types of Result Set variables or query do not match
    ORA-06512: at "APPS.MYPACK_PKG", line 11
    ORA-06512: at line 2
    

    現在10.2では、カーソルをPLSQLレコードにフェッチできますが、できません SQLオブジェクト内。

    更新:PLS-00306について :引数の数またはタイプが間違っています

    l_rarrayはネストされたテーブルです。要素を格納できるようにするには、初期化してから拡張する必要があります。例:

    SQL> CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
      2     PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
      3        lr_array tr_type := tr_type(); /* SQL Array */
      4     BEGIN
      5        FOR cc IN (SELECT e.empno, e.ENAME, NULL lastname
      6                     FROM scott.emp e) LOOP
      7           lr_array.extend;
      8           lr_array(lr_array.count) := r_type(cc.empno,
      9                                              cc.ename,
     10                                              cc.lastname);
     11           /* Here you can do additional procedural work on lr_array */
     12        END LOOP;
     13        /* then return the result set */
     14        OPEN r_cursor FOR SELECT * FROM TABLE (lr_array);
     15     END MY_PROC;
     16  END MYPACK_PKG;
     17  /
    
    Corps de package crÚÚ.
    
    SQL> print r
    
           SQN FIRSTNAME                      LASTNAME
    ---------- ------------------------------ -----------
          7369 SMITH                          
          7499 ALLEN                          
          7521 WARD                           
          [...]
    
    14 ligne(s) sÚlectionnÚe(s).
    

    詳細については、のドキュメントを参照してください。 PL/SQLのコレクションとレコード




    1. Laravel4の挿入クエリストアドプロシージャでパラメータを渡す

    2. OracleRAC環境からのExpdp

    3. COLLATION'utf8_general_ci'は、CHARACTERSET'latin1'には無効です。

    4. オブジェクトタイプをサポートする.Net用のサードパーティOracleプロバイダー