こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

無名ブロック内でのDDL実行について

環境は
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行まとめて記載するとエラーとなるのですが、
上記の通りそれぞれ分けて実行すると正常に動作するのです。
これはどこが悪いのでしょうか?

情けない事に、今日の午後はこれでほとんどつぶれてしまいました。
どなたか助けてください。

以上よろしくお願いします。

投稿日時 - 2011-06-06 23:21:27

QNo.6791387

すぐに回答ほしいです

質問者が選んだベストアンサー

PL/SQLプログラムを解析する時点で
テーブルが存在しないからエラーになります。
(エラーメッセージのとおりです)
INSERT文も動的SQLにしてください。

投稿日時 - 2011-06-07 00:04:57

お礼

なるほど。
おっしゃる通りですね。
ご指摘を受けて気づきました。
本当にありがとうございました。

念のために以下検証しました。
当然うまくいくこと確認できました。

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>

これで今夜はすっきり眠れます。

投稿日時 - 2011-06-07 00:28:12

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

INSTERT の前に COMMIT文があると、
結果がちがうのかなぁ?

投稿日時 - 2011-06-07 00:12:40

お礼

コメントありがとうございます。
dda167さんのご指摘の通りでした。

投稿日時 - 2011-06-07 00:30:06

あなたにオススメの質問