
いつもお世話になっております。
次で、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で質問しましょう!
似たような質問が見つかりました
- MySQL PHP 画像のアップロード Qiita 2 2022/11/28 04:44
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- PHP php エラー 2 2022/10/23 16:43
- MySQL あと、MySQLの文字コードはutf8 気になりますね 1 2022/12/01 07:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- MySQL #1062 - '0' は索引 'PRIMARY' で重複しています。とでています。 1 2023/01/01 06:13
- MySQL MySQLのテーブル作成でハイフン - は使用できないのでしょうか? 2 2022/10/21 16:50
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
このQ&Aを見た人はこんなQ&Aも見ています
-
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
【PL/SQL】FROM区に変数を使う方法
Oracle
-
テーブルの存在チェックについて
Oracle
-
-
4
SQL*Plusの終了はquit?exit?
Oracle
-
5
ストアド・プロシージャをバッチから起動させて実行する方法
Oracle
-
6
PL/SQL PLS-00103エラーについて
Oracle
-
7
PLSQLでファイルに書き込みをしたいけど出来ない。。
その他(データベース)
-
8
OracleのSQL*PLUSで、データが折り返されて見づらいのですが。。。
その他(データベース)
-
9
PL/SQLのコンパイルエラーについて(ignored)
Oracle
-
10
SQL、2つのテーブルで条件一致したものだけdeleteする方法は?
Oracle
-
11
PL/SQLで@ファイル名が反応しません
Oracle
-
12
PL/SQLカーソルの2重FORループができません
Oracle
-
13
ストアドプロシジャからストアドプロシジャを呼ぶには?
Oracle
-
14
Oracle 2つのDate型の値の差を「分」で取得したい
その他(データベース)
-
15
CASE文のエラーについて
Oracle
-
16
Oracleでの文字列連結サイズの上限
Oracle
-
17
Statement ignored というエラー
Oracle
-
18
3つ以上のテーブルをUNIONするのは現時的でないでしょうか?
MySQL
-
19
はじめまして!
Oracle
-
20
SQL Loaderを使いたい
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
PCC-S-02201エラーの対処を教え...
-
シェルスクリプトでオラクルの...
-
はじめまして!
-
ExcelVBAからOracleストアド実行
-
「ORA-00907: 右カッコがありま...
-
ACCESSでパススルークエリにパ...
-
PL/SQL PLS-00103エラーについて
-
CASE文のエラーについて
-
ORA-06502のエラー
-
ストアドファンクションの実行
-
オラクル致命的なエラー(provi...
-
HAVING句でのBETWEEN演算子
-
DDLトリガーの作成にて
-
DATABSE LINKについて
-
インポート時のエラーについて
-
エラーコードについて
-
オラクルでエラー「ORA-00052」...
-
データベースのカラムの型がCHA...
-
ビューが作成できない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
CASE文のエラーについて
-
はじめまして!
-
ORA-01843: 指定した月が無効で...
-
PL/SQL PLS-00103エラーについて
-
シェルスクリプトでオラクルの...
-
PL/SQLのコンパイルエラーにつ...
-
PCC-S-02201エラーの対処を教え...
-
「ORA-00907: 右カッコがありま...
-
ORA-14459: GLOBALキーワードが...
-
ORA-06502のエラー
-
PL/SQLでPLS-00201のエラー
-
DATABSE LINKについて
-
sqlのエラーハンドリングについ...
-
SQLLOADER
-
無効なSQL文の具体例を教えてく...
-
PL/SQLによるCREATE TABLE後のI...
-
ビューが作成できない
-
ストアドファンクションの実行
-
pro*c で pl/sql に変数を渡す...
おすすめ情報