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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
餃子を食べるとき、何をつけますか?
みんな大好き餃子。 ふと素朴な疑問ですが、餃子には何をつけて食べますか? 王道は醤油とお酢でしょうか。
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
「覚え間違い」を教えてください!
私はかなり長いこと「大団円」ということばを、たくさんの団員が祝ってくれるイメージで「大円団」だと間違えて覚えていました。
-
ちょっと先の未来クイズ第4問
11月ごろに発表される、2024年の「新語・流行語大賞」にノミネートされる言葉を書けるだけ書いてください。
-
【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
【お題】 ・急に朝起こしてきた母親に言われた一言とは?
-
PL/SQLをWindowsのBATファイルで実行するには
Oracle
-
CASE文のエラーについて
Oracle
-
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
CASE文のエラーについて
-
PL/SQLのコンパイルエラーにつ...
-
PL/SQL PLS-00103エラーについて
-
PL/SQLによるCREATE TABLE後のI...
-
【PL/SQL】SQL文が長すぎてSELE...
-
ACCESSでパススルークエリにパ...
-
「ORA-00907: 右カッコがありま...
-
ORA-01843: 指定した月が無効で...
-
ストアドファンクションの実行
-
SQLLOADER
-
オラクルエラー
-
PCC-S-02201エラーの対処を教え...
-
ビューが作成できない
-
はじめまして!
-
データーベースリンク
-
トリガーのエラー
-
[PL/SQL]セキュリティ違反でエラー
-
HAVING句でのBETWEEN演算子
-
シェルスクリプトでオラクルの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
CASE文のエラーについて
-
PL/SQLのコンパイルエラーにつ...
-
ORA-01843: 指定した月が無効で...
-
PL/SQL PLS-00103エラーについて
-
はじめまして!
-
シェルスクリプトでオラクルの...
-
「ORA-00907: 右カッコがありま...
-
sqlのエラーハンドリングについ...
-
PCC-S-02201エラーの対処を教え...
-
SQLLOADER
-
ACCESSでパススルークエリにパ...
-
HAVING句でのBETWEEN演算子
-
PL/SQLでPLS-00201のエラー
-
ORA-14459: GLOBALキーワードが...
-
PL/SQLによるCREATE TABLE後のI...
-
無効なSQL文の具体例を教えてく...
-
pro*c で pl/sql に変数を渡す...
-
DATABSE LINKについて
-
ORA-06502のエラー
おすすめ情報
自己解決しました。
変数のところではなく、REPLACEしている箇所のシングルコーテーションをエスケープ(?)していないのが原因でした。
EXECUTE IMMEDIATE 'CREATE TABLE AAA_WK AS SELECT * FROM AAA WHERE SUBSTR(REPLACE(STRDATE, ''/'' ,'''') ,1 ,6) > ''' || ls_month_max || '''';
ちなみにCREATE文の場合、バインド変数は使えないようです。