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

ここでEXECUTEIMMEDIATEが必要なのはなぜですか?

    PL / SQLブロック全体がコンパイル時に解析されますが、動的文内のテキストは実行時まで評価されません。 (匿名ブロックの場合もほぼ同じですが、手順は異なります)。

    if/elseも実行時まで評価されません。コンパイラは、挿入を実行するまでにテーブルが常に存在することを認識していません。ブロック全体を解析する時点でテーブルが存在するかどうかを確認することしかできません。

    テーブルがすでに存在する場合は問題ありません。コンパイラはそれを認識し、ブロックが実行され、selectが1を取得し、elseに移動して挿入を実行します。ただし、それが存在しない場合、挿入の解析は、ORA-00942コンパイル時で正しく失敗します。 ブロック内の何も実行されません。

    テーブルの作成は動的であるため、テーブルへのすべての参照も動的である必要があります。これまで見てきたように挿入だけでなく、クエリを実行する場合も同様です。基本的に、コードが読みにくくなり、構文エラーが隠される可能性があります-動的コードは実行時まで解析されないため、ブランチ内の動的ステートメントに誤りがあり、ヒットしない可能性があります。長い間。

    とにかく、グローバル一時テーブルをオンザフライで作成しないでください。これらは、各セッションに固有の一時データを持つ永続的なオブジェクトであり、アプリケーションコードの一部として作成/削除しないでください。 (通常、アプリケーションでスキーマの変更を行うことはできません。エラー、データ損失、予期しない副作用を回避するために、アップグレード/メンテナンスの変更に限定して制御する必要があります。GTTも例外ではありません)。

    他の一部のリレーショナルデータベースの一時テーブルとは異なり、Oracleデータベースに一時テーブルを作成する場合は、静的テーブル定義を作成します。一時テーブルはデータディクショナリに記述されている永続オブジェクトですが、セッションがデータをテーブルに挿入するまで空のように見えます。すべてのPL/SQLストアド・プロシージャではなく、データベース自体の一時表を作成します。

    GTTを一度作成し、すべてのPL/SQLコードを静的にします。 SQL Serverのローカル一時テーブルに近いものが必要な場合は、PL/SQLコレクションを調べてください。



    1. 外部サーバーに参加/プッシュダウンする前にサブクエリの評価を強制する方法

    2. ORA-28000を解決する方法アカウントがロックされています

    3. 累積合計を取得する方法

    4. Oracleのutl_file.fopenパラメータ