私は SQL Server ユーザーであり、Oracle を使用して行う小さなプロジェクトがあるため、Oracle の特殊性のいくつかを理解しようとしています。次の状況をよりよく理解するには、助けが必要だと思います。
作成する前に一時テーブルが存在するかどうかをテストしたいので、ここに次のコードを用意しました。
DECLARE
table_count INTEGER;
var_sql VARCHAR2(1000) := 'create GLOBAL TEMPORARY table TEST (
hello varchar(1000) NOT NULL)';
BEGIN
SELECT COUNT(*) INTO table_count FROM all_tables WHERE table_name = 'TEST';
IF table_count = 0 THEN
EXECUTE IMMEDIATE var_sql;
END IF;
END;
正常に動作するので、一度実行した後、IF に else ステートメントを追加しました。
ELSE
insert into test (hello) values ('hi');
もう一度実行すると、テストテーブルに行が追加されました。
OK、コードの準備ができて機能していたので、一時テーブルを削除してステートメント全体を再度実行しようとしましたが、実行すると次のエラーが発生します。
ORA-06550: line 11, column 19:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 11, column 7:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
次に、else ステートメントを次のように変更したところ、再び機能するようになりました。
ELSE
EXECUTE IMMEDIATE 'insert into test (hello) values (''hi'')';
私の質問は、個別に実行するのに、EXECUTE IMMEDIATE の代わりに単純に挿入を使用できる理由と、BEGIN の直後の SELECT ステートメントが機能するのに、残りのすべてが EXECUTE IMMEDIATE を正しく実行する必要があるように見える理由です。