Looking for oracle Answers? Try Ask4KnowledgeBase
Looking for oracle Keywords? Try Ask4Keywords

Oracle Database動的SQL


前書き

動的SQLを使用すると、実行時にSQLクエリコードをアセンブルできます。この手法にはいくつかの欠点があり、非常に注意深く使用する必要があります。同時に、より複雑なロジックを実装することができます。 PL / SQLでは、コードで使用されるすべてのオブジェクトがコンパイル時に存在し、有効である必要があります。そのため、PL / SQLでDDL文を直接実行することはできませんが、動的SQLではこれを実行できます。

備考

いくつかの重要な発言:

  1. 文字列連結を使用してクエリに値を追加したり、代わりにパラメータを使用したりしないでください。これは間違っています:

    execute immediate 'select value from my_table where id = ' || 
         id_valiable into result_variable;
    

    そして、これは正しいです:

    execute immediate 'select value from my_table where id = :P '
        using id_valiable into result_variable;
    

    これには2つの理由があります。 1つはセキュリティです。文字列連結はSQLインジェクションを可能にします。以下のクエリでは、変数に値1 or 1 = 1が含まれる場合、 UPDATEステートメントはテーブル内のすべての行を更新します。

    execute immediate 'update my_table set value = ''I have bad news for you'' where id = ' || id;
    

    2番目の理由はパフォーマンスです。 Oracleは、実行するたびにパラメータなしで問合せを解析しますが、パラメータ付き問合せはセッションで1回のみ解析されます。

  2. データベースエンジンがDDL文を実行するとき、前に暗黙のコミットを実行することに注意してください。

動的SQL 関連する例