sql >> Database teknologi >  >> RDS >> Oracle

Hvorfor kan vi ikke bruge stærk ref-markør med dynamisk SQL-sætning?

Her er en procedure med en stærkt indtastet ref-markør:

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>

Denne næste sætning mislykkes, fordi signaturen på EMP-posten ikke stemmer overens med DEPT-tabellen.

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>

Men hvis vi ændrer projektionen til at matche DEPT-tabellen, har vi succes igen:

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>

Så hvorfor kan vi ikke bruge en stærkt indtastet ref-cursor med dynamisk 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>

Fordi compileren ikke kan parse strengen i den dynamiske SQL-sætning. Så det kan ikke påstå, at kolonnerne i forespørgslens projektion matcher i antal og datatype signaturen af ​​ref-markøren. Følgelig kan den ikke validere kontrakten mellem ref-markørvariablen og forespørgslen. Det er endnu nemmere at forstå, hvorfor dette ikke kan tillades, når vi tænker på, at den dynamiske SQL-sætning kunne samles ud fra en forespørgsel på USER_TAB_COLUMNS.



  1. Flytning af eksisterende tabel fra primær filgruppe til en anden filgruppe

  2. Hvordan kan jeg omarbejde mit MySQL-kodeord, så jeg kan rake db:create on rails?

  3. Find dublerede rækker i SQL Server

  4. kalder SQL-funktionen i R-funktionen