• ベストアンサー

PL/SQLによるCREATE TABLE後のINSERTができない

いつもお世話になっております。 次で、PL/SQLで自動的に表tbを作成し、日時を挿入することを試みています。 BEGIN EXECUTE IMMEDIATE 'CREATE TABLE tb (t TIMESTAMP)'; INSERT INTO tb VALUES(SYSTIMESTAMP); END; / 実行すると、tbが作られていない旨のエラーになってしまいます。 INSERT部分がなければ、表tbは作成できます。 表を作成し、データを挿入するにはどのようにすればよろしいでしょうか。 何卒よろしくお願いいたします。

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

  • ベストアンサー
  • dda167
  • ベストアンサー率76% (55/72)
回答No.1

PL/SQLのプログラムは実行する前に解析されます。 実行する前にはtbというテーブルが存在しないのでエラーになります。 # 動的SQLの'CREATE TABLE ...'はただの文字列です。 回避策は、 1. CREATE TABLEとINSERTを別々のプログラムにする。 2. INSERTも動的SQLにする。 # DDL文とDML文を同一のプログラムで使用するときは注意が必要です。

kisoyasa
質問者

お礼

dda167 様 いつもいつも、本当にありがとうございます。 おかげさまで、INSERT部分を動的SQLで実行したら成功しました。 「CREATE TABLE ...」がただの文字列の状態のときに、INSERTが先に解析されてしまうのですね。 よく理解することができました。 いつも感謝しております。 ありがとうございました。

その他の回答 (2)

  • saneppie
  • ベストアンサー率66% (18/27)
回答No.3

PL/SQLは解析⇒実行ですよね。 この解析時にINSERTしたいテーブルがなければエラーになります。 なので、とりあえずエラーとしないのであれば、INSERT文も動的SQLにした方が良いと思います。 BEGIN EXECUTE IMMEDIATE 'CREATE TABLE tb (t TIMESTAMP)'; EXECUTE IMMEDIATE 'INSERT INTO tb VALUES(SYSDATE)'; END; / 間違ったINSERT文なら、実行前にエラーにしてくれるという恩恵にあずかれなくなりますが。

kisoyasa
質問者

お礼

saneppie 様 さっそくのご回答、ありがとうございました。 おっしゃる通り「INSERT文も動的SQLに」したら成功しました。 「解析⇒実行」で、解析のときにtbがなかったからエラーになったのですね。 おかげさまでよく理解できました。 ありがとうございました。

  • dda167
  • ベストアンサー率76% (55/72)
回答No.2

訂正します(寝ぼけてました)。 > 動的SQLの'CREATE TABLE ...'はただの文字列です。 動的SQLのCREATE TABLE文は実行するときに評価されます。 実行する前は単なる文字列です。 > 1. CREATE TABLEとINSERTを別々のプログラムにする。 1. あらかじめテーブルを作成しておく。

関連するQ&A