sql >> Database >  >> RDS >> Oracle

Waarom kunnen we geen sterke ref-cursor gebruiken met dynamische SQL-instructie?

Hier is een procedure met een sterk getypte ref-cursor:

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>

Deze volgende instructie mislukt omdat de handtekening van het EMP-record niet overeenkomt met die van de DEPT-tabel.

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>

Maar als we de projectie veranderen om overeen te komen met de DEPT-tabel, hebben we weer succes:

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>

Dus waarom kunnen we geen sterk getypeerde ref-cursor gebruiken met dynamische SQL?

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>

Omdat de compiler de tekenreeks in de dynamische SQL-instructie niet kan ontleden. Het kan dus niet beweren dat de kolommen in de projectie van de query qua aantal en datatype overeenkomen met de handtekening van de ref-cursor. Bijgevolg kan het het contract tussen de variabele ref cursor en de query niet valideren. Het is nog gemakkelijker te begrijpen waarom dit niet kan worden toegestaan ​​als we bedenken dat de dynamische SQL-instructie zou kunnen worden samengesteld uit een query op USER_TAB_COLUMNS.



  1. Ophalen/opslaan van alle gerelateerde acteurs in Freebase

  2. CURRENT_TIMESTAMP() Functie in Oracle

  3. Hoe UPDATE van SELECT te gebruiken in SQL Server

  4. Is dit genoeg voor een veilige site? (4 kleine functies)