
いつもお世話になっております。
次で、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も見ています
-
【PL/SQL】FROM区に変数を使う方法
Oracle
-
テーブルの存在チェックについて
Oracle
-
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
-
4
SQL*Plusの終了はquit?exit?
Oracle
-
5
引数によってwhere句を切り替える方法
Oracle
-
6
PL/SQLカーソルの2重FORループができません
Oracle
-
7
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
8
ストアド・プロシージャをバッチから起動させて実行する方法
Oracle
-
9
PL/SQL PLS-00103エラーについて
Oracle
-
10
シェルスクリプトでオラクルのエラーメッセージを取得するには
Oracle
-
11
Statement ignored というエラー
Oracle
-
12
CASE文のエラーについて
Oracle
-
13
異なるスキーマからデータを抽出するには?oracl、PL/SQL
Oracle
-
14
PLSQLでファイルに書き込みをしたいけど出来ない。。
その他(データベース)
-
15
OracleのSQL*PLUSで、データが折り返されて見づらいのですが。。。
その他(データベース)
-
16
PL/SQLのコンパイルエラーについて(ignored)
Oracle
-
17
カーソル宣言をIFで分けられませんか?
Oracle
-
18
PL/SQLで@ファイル名が反応しません
Oracle
-
19
select句副問い合わせ 値の個数が多すぎます
Oracle
-
20
単一グループのグループ関数ではありません。
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
CASE文のエラーについて
-
はじめまして!
-
ORA-01843: 指定した月が無効で...
-
シェルスクリプトでオラクルの...
-
オラクル表領域データファイル...
-
PCC-S-02201エラーの対処を教え...
-
PL/SQL PLS-00103エラーについて
-
「ORA-00907: 右カッコがありま...
-
pro*c で pl/sql に変数を渡す...
-
ACCESSでパススルークエリにパ...
-
ORA-06502のエラー
-
HAVING句でのBETWEEN演算子
-
無効なSQL文の具体例を教えてく...
-
sqlのエラーハンドリングについ...
-
PL/SQLのコンパイルエラーにつ...
-
【Oracle】リモートでのimpコマ...
-
SQLLOADER
-
ストアドファンクションの実行
-
データベースのカラムの型がCHA...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
CASE文のエラーについて
-
はじめまして!
-
PL/SQL PLS-00103エラーについて
-
「ORA-00907: 右カッコがありま...
-
ORA-01843: 指定した月が無効で...
-
ORA-06502のエラー
-
PCC-S-02201エラーの対処を教え...
-
シェルスクリプトでオラクルの...
-
PL/SQLによるCREATE TABLE後のI...
-
DATABSE LINKについて
-
PL/SQLのコンパイルエラーにつ...
-
エラーコードについて
-
SQLLOADER
-
sqlのエラーハンドリングについ...
-
ビューが作成できない
-
データベースのカラムの型がCHA...
-
ORA-12571パケット書き込みエラ...
-
PL-SQLでORA-01013エラー
-
PL/SQLでPLS-00201のエラー
おすすめ情報