![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
いつもお世話になっております。
次で、PL/SQLで自動的に表tbを作成し、日時を挿入することを試みています。
BEGIN
EXECUTE IMMEDIATE
'CREATE TABLE tb (t TIMESTAMP)';
INSERT INTO tb VALUES(SYSTIMESTAMP);
END;
/
実行すると、tbが作られていない旨のエラーになってしまいます。
INSERT部分がなければ、表tbは作成できます。
表を作成し、データを挿入するにはどのようにすればよろしいでしょうか。
何卒よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
PL/SQLのプログラムは実行する前に解析されます。
実行する前にはtbというテーブルが存在しないのでエラーになります。
# 動的SQLの'CREATE TABLE ...'はただの文字列です。
回避策は、
1. CREATE TABLEとINSERTを別々のプログラムにする。
2. INSERTも動的SQLにする。
# DDL文とDML文を同一のプログラムで使用するときは注意が必要です。
dda167 様
いつもいつも、本当にありがとうございます。
おかげさまで、INSERT部分を動的SQLで実行したら成功しました。
「CREATE TABLE ...」がただの文字列の状態のときに、INSERTが先に解析されてしまうのですね。
よく理解することができました。
いつも感謝しております。
ありがとうございました。
No.3
- 回答日時:
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がなかったからエラーになったのですね。
おかげさまでよく理解できました。
ありがとうございました。
No.2
- 回答日時:
訂正します(寝ぼけてました)。
> 動的SQLの'CREATE TABLE ...'はただの文字列です。
動的SQLのCREATE TABLE文は実行するときに評価されます。
実行する前は単なる文字列です。
> 1. CREATE TABLEとINSERTを別々のプログラムにする。
1. あらかじめテーブルを作成しておく。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
カーソル0件の時にエラーを発生させる
Oracle
-
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
PL/SQLのコンパイルエラーについて(ignored)
Oracle
-
-
4
PL/SQLをWindowsのBATファイルで実行するには
Oracle
-
5
PL/SQLでのSQL文法
その他(データベース)
-
6
Oracleでの文字列連結サイズの上限
Oracle
-
7
ORA-06502のエラー
Oracle
-
8
テーブルの存在チェックについて
Oracle
-
9
ストアド実行時のエラー「参照しているコレクションは初期化されていません」
Oracle
-
10
ストアド・プロシージャをバッチから起動させて実行する方法
Oracle
-
11
PL/SQLでログを確認したい。
Oracle
-
12
PL/SQLで@ファイル名が反応しません
Oracle
-
13
PL/SQLのプロシージャ間でカーソル?の受渡
その他(プログラミング・Web制作)
-
14
カーソル定義での条件分岐
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
PL/SQLのコンパイルエラーにつ...
-
SQLLOADER
-
ストアドファンクションの実行
-
シェルスクリプトでオラクルの...
-
PL/SQL PLS-00103エラーについて
-
「ORA-00907: 右カッコがありま...
-
PCC-S-02201エラーの対処を教え...
-
CASE文のエラーについて
-
ORA-01843: 指定した月が無効で...
-
HAVING句でのBETWEEN演算子
-
Oracle10gをACCESSでリンクした...
-
OracleとADO
-
はじめまして!
-
マテリアライズドビューの更新...
-
01722 数値が無効です
-
インポート時のエラーについて
-
NVL関数について
-
sqlのエラーハンドリングについ...
-
データベースのカラムの型がCHA...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
CASE文のエラーについて
-
PL/SQLのコンパイルエラーにつ...
-
ORA-01843: 指定した月が無効で...
-
「ORA-00907: 右カッコがありま...
-
PL/SQL PLS-00103エラーについて
-
PCC-S-02201エラーの対処を教え...
-
はじめまして!
-
データベースのカラムの型がCHA...
-
SQLLOADER
-
無効なSQL文の具体例を教えてく...
-
ストアドファンクションの実行
-
sqlのエラーハンドリングについ...
-
シェルスクリプトでオラクルの...
-
ORA-06502のエラー
-
DATABSE LINKについて
-
HAVING句でのBETWEEN演算子
-
PL/SQLでPLS-00201のエラー
-
ORA-14459: GLOBALキーワードが...
-
ACCESSでパススルークエリにパ...
おすすめ情報