Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ORA-00932:inkonsistente Datentypen:erwartet - erhalten -

Die Art und Weise, wie Sie den REF CURSOR verwenden, ist ungewöhnlich. Dies wäre die Standardmethode, sie zu verwenden:

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).

Ich bin mir nicht sicher, was Sie hier erreichen wollen, Sie rufen den Ref-Cursor innerhalb der Prozedur ab und geben dann einen anderen Ref-Cursor zurück, der dieselben Daten enthält. Ich glaube nicht, dass es notwendig ist, den Cursor in der Prozedur überhaupt abzurufen. Überlassen Sie das Abrufen der aufrufenden App (hier erfolgt das Abrufen durch print ).

Update:Warum erhalten Sie die nicht hilfreiche Fehlermeldung?

Sie verwenden einen dynamisch geöffneten Cursor, und ich denke, das ist einer der Gründe, warum Sie die nicht hilfreiche Fehlermeldung erhalten. Wenn wir festes SQL verwenden, ist die Fehlermeldung anders:

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

Ich habe dargelegt, dass Sie derzeit in 10.2 einen Cursor in einen PLSQL-Datensatz abrufen können, aber nicht in einem SQL-Objekt.

Aktualisierung:bezüglich PLS-00306 :falsche Anzahl oder Art der Argumente

l_rarray ist eine NESTED TABLE, sie muss initialisiert und dann erweitert werden, um Elemente speichern zu können. Zum Beispiel:

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).

Weitere Informationen finden Sie in der Dokumentation zu PL/SQL-Sammlungen und -Datensätze .