- ベストアンサー
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は作成できます。 表を作成し、データを挿入するにはどのようにすればよろしいでしょうか。 何卒よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
PL/SQLのプログラムは実行する前に解析されます。 実行する前にはtbというテーブルが存在しないのでエラーになります。 # 動的SQLの'CREATE TABLE ...'はただの文字列です。 回避策は、 1. CREATE TABLEとINSERTを別々のプログラムにする。 2. INSERTも動的SQLにする。 # DDL文とDML文を同一のプログラムで使用するときは注意が必要です。
その他の回答 (2)
- saneppie
- ベストアンサー率66% (18/27)
PL/SQLは解析⇒実行ですよね。 この解析時にINSERTしたいテーブルがなければエラーになります。 なので、とりあえずエラーとしないのであれば、INSERT文も動的SQLにした方が良いと思います。 BEGIN EXECUTE IMMEDIATE 'CREATE TABLE tb (t TIMESTAMP)'; EXECUTE IMMEDIATE 'INSERT INTO tb VALUES(SYSDATE)'; END; / 間違ったINSERT文なら、実行前にエラーにしてくれるという恩恵にあずかれなくなりますが。
お礼
saneppie 様 さっそくのご回答、ありがとうございました。 おっしゃる通り「INSERT文も動的SQLに」したら成功しました。 「解析⇒実行」で、解析のときにtbがなかったからエラーになったのですね。 おかげさまでよく理解できました。 ありがとうございました。
- dda167
- ベストアンサー率76% (55/72)
訂正します(寝ぼけてました)。 > 動的SQLの'CREATE TABLE ...'はただの文字列です。 動的SQLのCREATE TABLE文は実行するときに評価されます。 実行する前は単なる文字列です。 > 1. CREATE TABLEとINSERTを別々のプログラムにする。 1. あらかじめテーブルを作成しておく。
お礼
dda167 様 いつもいつも、本当にありがとうございます。 おかげさまで、INSERT部分を動的SQLで実行したら成功しました。 「CREATE TABLE ...」がただの文字列の状態のときに、INSERTが先に解析されてしまうのですね。 よく理解することができました。 いつも感謝しております。 ありがとうございました。