Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mengapa kita tidak dapat menggunakan kursor ref yang kuat dengan Pernyataan SQL dinamis?

Berikut adalah prosedur dengan kursor ref yang diketik dengan kuat:

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>

Pernyataan berikutnya gagal karena tanda tangan catatan EMP tidak cocok dengan tanda tangan tabel 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>

Tetapi jika kita mengubah proyeksi agar sesuai dengan tabel DEPT maka kita berhasil lagi:

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>

Jadi, mengapa kita tidak bisa menggunakan kursor ref yang diketik dengan kuat dengan SQL dinamis?

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>

Karena kompiler tidak dapat mengurai string dalam pernyataan SQL dinamis. Jadi tidak dapat menyatakan bahwa kolom dalam proyeksi kueri cocok dengan jumlah dan tipe data tanda tangan kursor ref. Akibatnya tidak dapat memvalidasi kontrak antara variabel kursor ref dan kueri. Bahkan lebih mudah untuk memahami mengapa hal ini tidak dapat diizinkan ketika kami menganggap bahwa pernyataan SQL dinamis dapat dikumpulkan dari kueri di 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. periksa apakah itu fungsi angka di Oracle

  2. Oracle SQL mengembalikan baris dengan cara yang sewenang-wenang ketika tidak ada klausa urutan dengan yang digunakan

  3. Menggunakan PL/SQL bagaimana Anda memasukkan konten file ke gumpalan?

  4. Bagaimana cara mengecilkan tablespace temp di Oracle?

  5. Menguji fungsi Oracle to_date