PL / SQLブロック全体がコンパイル時に解析されますが、動的文内のテキストは実行時まで評価されません。 (匿名ブロックの場合もほぼ同じですが、手順は異なります)。
if/elseも実行時まで評価されません。コンパイラは、挿入を実行するまでにテーブルが常に存在することを認識していません。ブロック全体を解析する時点でテーブルが存在するかどうかを確認することしかできません。
テーブルがすでに存在する場合は問題ありません。コンパイラはそれを認識し、ブロックが実行され、selectが1を取得し、elseに移動して挿入を実行します。ただし、それが存在しない場合、挿入の解析は、ORA-00942コンパイル時で正しく失敗します。 ブロック内の何も実行されません。
テーブルの作成は動的であるため、テーブルへのすべての参照も動的である必要があります。これまで見てきたように挿入だけでなく、クエリを実行する場合も同様です。基本的に、コードが読みにくくなり、構文エラーが隠される可能性があります-動的コードは実行時まで解析されないため、ブランチ内の動的ステートメントに誤りがあり、ヒットしない可能性があります。長い間。
とにかく、グローバル一時テーブルをオンザフライで作成しないでください。これらは、各セッションに固有の一時データを持つ永続的なオブジェクトであり、アプリケーションコードの一部として作成/削除しないでください。 (通常、アプリケーションでスキーマの変更を行うことはできません。エラー、データ損失、予期しない副作用を回避するために、アップグレード/メンテナンスの変更に限定して制御する必要があります。GTTも例外ではありません)。
他の一部のリレーショナルデータベースの一時テーブルとは異なり、Oracleデータベースに一時テーブルを作成する場合は、静的テーブル定義を作成します。一時テーブルはデータディクショナリに記述されている永続オブジェクトですが、セッションがデータをテーブルに挿入するまで空のように見えます。すべてのPL/SQLストアド・プロシージャではなく、データベース自体の一時表を作成します。
GTTを一度作成し、すべてのPL/SQLコードを静的にします。 SQL Serverのローカル一時テーブルに近いものが必要な場合は、PL/SQLコレクションを調べてください。