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

Tại sao chúng ta không thể sử dụng con trỏ tham chiếu mạnh với Câu lệnh SQL động?

Đây là quy trình có con trỏ tham chiếu được nhập mạnh:

SQL> create or replace procedure p1 is
  2      type dept_rc is ref cursor return dept%rowtype;
  3      my_ref_cursor dept_rc;
  4  begin
  5      open my_ref_cursor for
  6          select * from dept;
  7  end;
  8  /

Procedure created.

SQL>

Câu lệnh tiếp theo này không thành công vì chữ ký của bản ghi EMP không khớp với chữ ký của bảng DEPT.

SQL> create or replace procedure p1 is
  2      type dept_rc is ref cursor return dept%rowtype;
  3      my_ref_cursor dept_rc;
  4  begin
  5      open my_ref_cursor for
  6          select * from emp;
  7  end;
  8  /

Warning: Procedure created with compilation errors.

SQL> show error
Errors for PROCEDURE P1:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/5      PL/SQL: SQL Statement ignored
6/9      PLS-00382: expression is of wrong type

SQL>

Nhưng nếu chúng ta thay đổi phép chiếu để phù hợp với bảng DEPT thì chúng ta lại thành công:

SQL> create or replace procedure p1 is
  2      type dept_rc is ref cursor return dept%rowtype;
  3      my_ref_cursor dept_rc;
  4  begin
  5      open my_ref_cursor for
  6          select deptno, ename, job from emp;
  7  end;
  8  /

Procedure created.

SQL>

Vì vậy, tại sao chúng ta không thể sử dụng con trỏ ref được gõ mạnh với SQL động?

SQL> create or replace procedure p1 is
  2      type dept_rc is ref cursor return dept%rowtype;
  3      my_ref_cursor dept_rc;
  4  begin
  5      open my_ref_cursor for
  6          'select * from dept';
  7  end;
  8  /

Warning: Procedure created with compilation errors.

SQL> show error
Errors for PROCEDURE P1:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/5      PL/SQL: Statement ignored
5/10     PLS-00455: cursor 'MY_REF_CURSOR' cannot be used in dynamic SQL
         OPEN statement

SQL>

Vì trình biên dịch không thể phân tích cú pháp chuỗi trong câu lệnh SQL động. Vì vậy, nó không thể khẳng định rằng các cột trong phép chiếu của truy vấn khớp về số lượng và kiểu dữ liệu là chữ ký của con trỏ tham chiếu. Do đó, nó không thể xác thực hợp đồng giữa biến con trỏ ref và truy vấn. Thậm chí còn dễ hiểu hơn tại sao điều này không thể được cho phép khi chúng tôi cho rằng câu lệnh SQL động có thể được tập hợp từ một truy vấn trên USER_TAB_COLUMNS.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đọc clob từng dòng với pl \ sql

  2. Quay lại lời nhắc sqlplus

  3. Cách gọi hàm bảng Oracle (hàm pipelined) từ .NET

  4. Hàm hoặc Thủ tục cho mệnh đề IN

  5. 12c Kế hoạch thích ứng trong nhà phát triển SQL