
Oracle11gのPL/SQLで動的SQLを使おうと思うのですが、下記エラーが発生してしまいます。
どこが間違っているのか、いろいろと変更してみたのですが、わかりませんので、教えてください。
「ORA-06502:PL/SQL:数値または値のエラー:文字から数値への変換エラー。が発生しました」
ワークのテーブルを一旦削除してから、新規に追加し、データを登録する処理です。
EXECUTE IMMEDIATE 'DROP TABLE AAA_WK';
EXECUTE IMMEDIATE 'CREATE TABLE AAA_WK AS SELECT * FROM AAA WHERE SUBSTR(REPLACE(STRDATE, '/' ,'') ,1 ,6) > ' || ls_month_max;
EXECUTE IMMEDIATE 'TRUNCATE TABLE AAA';
EXECUTE IMMEDIATE 'INSERT INTO AAA SELECT * FROM AAAA_WK';
STRDATE:文字列の日付~時刻が入っています(例:2016/09/10 12:10:10)
ls_month_max:'201608'の文字列です
2つ目のEXECUTE IMMEDIATEでエラーが発生します。
ある年月(201608)より大きいデータを取得したいです。
TO_NUMBERにして変数も数値型にして書いてもダメでした。
変数(ls_month_max)をシングルコートで囲ってもダメでした。
相談できる人がいないため、よろしくお願いいたします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
STRDATEってのは、本当に文字列(VARCHAR2型など)ですか?
DATE型なら、TO_CHAR(STRDATE, 'YYYYMM')としないとダメですよ。
SELECT SUBSTR(REPLACE(STRDATE, '/' ,'') ,1 ,6)
FROM AAA
で返ってきてる値は正しいですか?
また、テーブル列を加工するとインデックスが効きません。
要件にもよりますが、やるなら
STRDATE BETWEEN 開始日 AND 終了日
とかの方がいいと思います。
あと、ここにあるように、SQLの解析が都度発生するため、プレースホルダーを利用したクエリにした方がいいでしょう。
http://www.shift-the-oracle.com/plsql/native-dyn …
一度きり、およびそこまでパフォーマンスが気にならないデータ量ならどうでもいいです。
> STRDATEってのは、本当に文字列(VARCHAR2型など)ですか?
はい、VARCHAR2です。
登録日時を文字列型で持っています。
> SELECT SUBSTR(REPLACE(STRDATE, '/' ,'') ,1 ,6) FROM AAA
これは通ります。
select * from AAA
where SUBSTR(REPLACE(STRDATE, '/' ,'') ,1 ,6) > '201608'
これでデータが取得できます。
記載いただいたURLを参考に、バインド変数にしてみましたが、同じ結果でした。
ls_sql := 'CREATE TABLE AAA_WK AS SELECT * FROM AAA WHERE SUBSTR(REPLACE(STRDATE, '/' ,'') ,1 ,6) > :"month"';
EXECUTE IMMEDIATE ls_sql USING IN ls_month_max;
No.1
- 回答日時:
テーブルAAAと、AAA_WKの構造が違うんじゃないんですか?
条件はともかくとして、
CREATE TABLE AAA_WK AS SELECT * FROM AAA
で通るんですか?
naktakさん
ありがとうございます。
CREATE TABLE AAA_WK AS SELECT * FROM AAA
これは実行できています。
WHERE句をなくして
EXECUTE IMMEDIATE 'CREATE TABLE AAA_WK AS SELECT * FROM AAA'
とすると、実行でき、データも入ってきますので、WHERE句の部分がおかしいようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- Excel(エクセル) EXCELの「接続」のSQLのコマンド文字列にて、セルから任意の数値を利用したい 2 2023/03/09 16:43
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
はじめまして!
-
CASE文のエラーについて
-
「ORA-00907: 右カッコがありま...
-
PL/SQL PLS-00103エラーについて
-
pro*c で pl/sql に変数を渡す...
-
PCC-S-02201エラーの対処を教え...
-
エラーコードについて
-
オラクル表領域データファイル...
-
ORA-01843: 指定した月が無効で...
-
sqlのエラーハンドリングについ...
-
オラクル致命的なエラー(provi...
-
データーベースリンク
-
PL/SQLのコンパイルエラーにつ...
-
ORA-12542 困ってます
-
無効なSQL文の具体例を教えてく...
-
引数にBoolean型を指定したい
-
SQL*Plus内でPL/SQL、SQLを実行...
-
PL-SQLでORA-01013エラー
-
PL/SQLによるCREATE TABLE後のI...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
PL/SQL PLS-00103エラーについて
-
CASE文のエラーについて
-
ORA-01843: 指定した月が無効で...
-
はじめまして!
-
PCC-S-02201エラーの対処を教え...
-
「ORA-00907: 右カッコがありま...
-
ORA-06502のエラー
-
シェルスクリプトでオラクルの...
-
PL/SQLによるCREATE TABLE後のI...
-
PL/SQLのコンパイルエラーにつ...
-
ACCESSでパススルークエリにパ...
-
データベースのカラムの型がCHA...
-
ビューが作成できない
-
HAVING句でのBETWEEN演算子
-
ORA-12571パケット書き込みエラ...
-
無効なSQL文の具体例を教えてく...
-
pro*c で pl/sql に変数を渡す...
-
PL/SQLでPLS-00201のエラー
-
エラーコードについて
おすすめ情報
自己解決しました。
変数のところではなく、REPLACEしている箇所のシングルコーテーションをエスケープ(?)していないのが原因でした。
EXECUTE IMMEDIATE 'CREATE TABLE AAA_WK AS SELECT * FROM AAA WHERE SUBSTR(REPLACE(STRDATE, ''/'' ,'''') ,1 ,6) > ''' || ls_month_max || '''';
ちなみにCREATE文の場合、バインド変数は使えないようです。