Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dlaczego nie możemy użyć silnego kursora ref z dynamiczną instrukcją SQL?

Oto procedura z silnie wpisanym kursorem ref:

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>

Kolejna instrukcja nie powiedzie się, ponieważ podpis rekordu EMP nie jest zgodny z podpisem tabeli 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>

Ale jeśli zmienimy projekcję, aby dopasować ją do tabeli DEPT, znowu odniesiemy sukces:

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>

Dlaczego więc nie możemy użyć silnie wpisanego ref-cursora z dynamicznym 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>

Ponieważ kompilator nie może przeanalizować ciągu w dynamicznej instrukcji SQL. Nie można więc stwierdzić, że kolumny w projekcji zapytania pod względem liczby i typu danych są zgodne z sygnaturą kursora ref. W związku z tym nie może sprawdzić poprawności kontraktu między zmienną kursora ref a zapytaniem. Jeszcze łatwiej zrozumieć, dlaczego nie można na to pozwolić, jeśli weźmiemy pod uwagę, że dynamiczna instrukcja SQL może zostać złożona z zapytania w 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. Jak uzyskać wszystkie poziomy danych za pomocą pojedynczego zapytania SQL dla zestawienia materiałów?

  2. Oracle TO_DATE NIE zgłasza błędu

  3. Projekt bazy danych planowania lekarza

  4. Jak w Oracle 11g waży się średnią danych godzinowych między dwiema datami?

  5. Jak automatycznie zwiększyć identyfikator w złożonym kluczu podstawowym w Hibernate?