Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

ORA-00932:kiểu dữ liệu không nhất quán:dự kiến ​​- có -

Cách bạn đang sử dụng REF CURSOR là không phổ biến. Đây sẽ là cách tiêu chuẩn để sử dụng chúng:

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

Tôi không chắc bạn đang cố gắng thực hiện điều gì ở đây, bạn đang tìm nạp con trỏ tham chiếu bên trong thủ tục và sau đó trả về một con trỏ tham chiếu khác sẽ có cùng dữ liệu. Tôi không nghĩ rằng cần thiết phải tìm nạp con trỏ trong quy trình. Hãy để ứng dụng gọi điện thực hiện tìm nạp (ở đây, việc tìm nạp được thực hiện bởi print ).

Cập nhật:tại sao bạn nhận được thông báo lỗi không hữu ích?

Bạn đang sử dụng con trỏ được mở động và tôi nghĩ đó là một phần lý do khiến bạn nhận được thông báo lỗi không hữu ích. Nếu chúng tôi sử dụng SQL cố định, thông báo lỗi sẽ khác:

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

Tôi đã phác thảo rằng hiện tại trong 10.2, bạn có thể tìm nạp con trỏ vào bản ghi PLSQL nhưng không trong Đối tượng SQL.

Cập nhật:về PLS-00306 :sai số hoặc loại đối số

l_rarray là một NESTED TABLE, nó cần được khởi tạo và sau đó mở rộng để có thể lưu trữ các phần tử. Ví dụ:

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

Để đọc thêm, bạn có thể duyệt qua tài liệu cho Bộ sưu tập và bản ghi 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. Hỗ trợ cận âm cho Oracle ODP.NET?

  2. Cách xuất kết quả truy vấn sang tệp .txt khi sử dụng SQLcl (Oracle)

  3. Truy vấn đệ quy Oracle 10g

  4. Cách tạo thư mục zip trong plsql (Oracle)

  5. làm thế nào để tăng giá trị datetime với giá trị gia tăng là 30 phút trong oracle?