sql >> データベース >  >> RDS >> Oracle

動的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  /
    
    Procedure created.
    
    SQL>
    

    EMPレコードの署名が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>
    

    しかし、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 deptno, ename, job from emp;
      7  end;
      8  /
    
    Procedure created.
    
    SQL>
    

    では、なぜ動的SQLで強く型付けされた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  /
    
    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>
    

    コンパイラは動的SQLステートメントの文字列を解析できないためです。したがって、クエリのプロジェクションの列の数とデータ型が参照カーソルのシグネチャと一致することを表明することはできません。したがって、refカーソル変数とクエリの間のコントラクトを検証できません。動的SQLステートメントがUSER_TAB_COLUMNSのクエリからアセンブルされる可能性があると考えると、これが許可されない理由を理解するのはさらに簡単です。



    1. mysqlで機能しないクエリを削除する

    2. PHPとjQueryを介したMySQLのJavaScript配列への解析

    3. MySQLテーブルに基づいてC#クラスを作成します

    4. 動的外部キーを持つことは可能ですか、そしてそれを行うための最良/正しいものは何ですか?