アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

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

A 回答 (2件)

PL/SQLプログラムを解析する時点で


テーブルが存在しないからエラーになります。
(エラーメッセージのとおりです)
INSERT文も動的SQLにしてください。
    • good
    • 0
この回答へのお礼

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

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

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

INSTERT の前に COMMIT文があると、


結果がちがうのかなぁ?
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/06/07 00:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!