プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております。
次で、PL/SQLで自動的に表tbを作成し、日時を挿入することを試みています。

BEGIN
EXECUTE IMMEDIATE
'CREATE TABLE tb (t TIMESTAMP)';
INSERT INTO tb VALUES(SYSTIMESTAMP);
END;
/

実行すると、tbが作られていない旨のエラーになってしまいます。
INSERT部分がなければ、表tbは作成できます。
表を作成し、データを挿入するにはどのようにすればよろしいでしょうか。
何卒よろしくお願いいたします。

A 回答 (3件)

PL/SQLのプログラムは実行する前に解析されます。



実行する前にはtbというテーブルが存在しないのでエラーになります。

# 動的SQLの'CREATE TABLE ...'はただの文字列です。

回避策は、

1. CREATE TABLEとINSERTを別々のプログラムにする。
2. INSERTも動的SQLにする。

# DDL文とDML文を同一のプログラムで使用するときは注意が必要です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/01/24 16:51

PL/SQLは解析⇒実行ですよね。


この解析時にINSERTしたいテーブルがなければエラーになります。
なので、とりあえずエラーとしないのであれば、INSERT文も動的SQLにした方が良いと思います。

BEGIN
EXECUTE IMMEDIATE
'CREATE TABLE tb (t TIMESTAMP)';
EXECUTE IMMEDIATE
'INSERT INTO tb VALUES(SYSDATE)';
END;
/

間違ったINSERT文なら、実行前にエラーにしてくれるという恩恵にあずかれなくなりますが。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/01/24 16:53

訂正します(寝ぼけてました)。



> 動的SQLの'CREATE TABLE ...'はただの文字列です。
動的SQLのCREATE TABLE文は実行するときに評価されます。
実行する前は単なる文字列です。

> 1. CREATE TABLEとINSERTを別々のプログラムにする。
1. あらかじめテーブルを作成しておく。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す