Oracle
 sql >> база данни >  >> RDS >> Oracle

ORA-00932:непоследователни типове данни:очаквано - получено -

Начинът, по който използвате REF CURSOR, е необичаен. Това би бил стандартният начин за използването им:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle преобразуване на UNIX timestamp в timestamp с часова зона

  2. Вмъкване на данни в базата данни на Oracle с помощта на php

  3. Прекъсвайте равни периоди в края на месеца

  4. Коригиране на грешка „ORA-01789:блокът на заявката има неправилен брой колони с резултати“

  5. Oracle/Sybase SQL - вземете стойност въз основа на предишен запис (не просто LAG)