※ ChatGPTを利用し、要約された質問です(原文:無名ブロック内でのDDL実行について)
無名ブロック内でのDDL実行について
このQ&Aのポイント
無名ブロック内でCREATE TABLE文を実行し、EX01テーブルを作成します。その後、INSERT文でデータを挿入し、最後にDROP TABLE文でテーブルを削除します。
無名ブロック内で3つの処理を行いたい場合、それぞれの処理を分けて実行する必要があります。まずはCREATE TABLE文のみを実行してテーブルを作成し、次にINSERT文でデータを挿入し、最後にDROP TABLE文でテーブルを削除します。
無名ブロック内でCREATE TABLE文の実行後にINSERT文を実行するとエラーが発生し、テーブルが存在しないというエラーメッセージが表示されます。そのため、CREATE TABLE文とINSERT文を分けて実行する必要があります。
環境は
Linux + oracle 10g R2です。
簡単な無名プロシージャを書いていてはまって
しまいました。
分かる方でしたら、あっというまに指摘していただけそうなので
こちらに質問しました。
無名ブロック内で以下の事を行いたいのですが、うまく動作を確認できません。
※以下は意味の無い処理となっていますが、今回説明用に短くしてみました。
◇実現したい事
1.CREATE TABLE文の実行 (ここではEX01テーブルを作成します)
2.CREATE したテーブルにたいしてINSERT
3.CREATE したテーブルのDROP
◇私の実行結果
$ sqlplus scott/tiger@orcl
SQL> SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME ='EX01';
レコードが選択されませんでした。
-- 私の思いでは以下のプロシージャは正常に動作するのでは?
-- と思うのですが、以下の通りエラーとなってしまいます。
--
SQL> BEGIN
2 DBMS_UTILITY.EXEC_DDL_STATEMENT('CREATE TABLE EX01 ( C1 NUMBER,C2 VARCHAR2(10))');
3 INSERT INTO EX01(C1,C2) VALUES(1,'AAA');
4 DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TABLE EX01');
5 END;
6 /
INSERT INTO EX01(C1,C2) VALUES(1,'AAA');
*
行3でエラーが発生しました。:
ORA-06550: 行3、列13:
PL/SQL: ORA-00942: 表またはビューが存在しません。
ORA-06550: 行3、列1:
PL/SQL: SQL Statement ignored
--
-- なので、処理を分割して行ってみました。
-- まずはCREATE TABLEのみ
--
SQL> BEGIN
2 DBMS_UTILITY.EXEC_DDL_STATEMENT('CREATE TABLE EX01 ( C1 NUMBER,C2 VARCHAR2(10))');
3 END;
4 /
PL/SQLプロシージャが正常に完了しました。
--
-- CREATE TABLEは正常に動作したようです。
--
SQL> INSERT INTO EX01(C1,C2) VALUES(1,'AAA');
1行が作成されました。
--
-- INSERT文も正常に動作したようです。
--
SQL> BEGIN
2 DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TABLE EX01');
3 END;
4 /
PL/SQLプロシージャが正常に完了しました。
--
-- なんとDROP TABLEも正常に動作したようです。
--
SQL> SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME ='EX01';
レコードが選択されませんでした。
SQL>
そうなんです。3行まとめて記載するとエラーとなるのですが、
上記の通りそれぞれ分けて実行すると正常に動作するのです。
これはどこが悪いのでしょうか?
情けない事に、今日の午後はこれでほとんどつぶれてしまいました。
どなたか助けてください。
以上よろしくお願いします。
お礼
なるほど。 おっしゃる通りですね。 ご指摘を受けて気づきました。 本当にありがとうございました。 念のために以下検証しました。 当然うまくいくこと確認できました。 SQL> BEGIN 2 DBMS_UTILITY.EXEC_DDL_STATEMENT('CREATE TABLE EX01 ( C1 NUMBER,C2 VARCHAR2(10))'); 3 EXECUTE IMMEDIATE 'INSERT INTO EX01(C1,C2) VALUES(1,''AAA'')'; 4 DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TABLE EX01'); 5 END; 6 / PL/SQLプロシージャが正常に完了しました。 SQL> これで今夜はすっきり眠れます。