ORA-01722: 数値が無効です

このQ&Aのポイント
  • ORA-01722エラーが発生しました。ストアドプロシージャ内でのSQLで、文字列型と数値型の比較が行われたためです。
  • システムのテスト環境ではエラーが発生していないが、本番環境ではエラーが発生しないのはなぜでしょうか?
  • エラーの原因について詳しく調査しています。原因がわかり次第、お知らせいたします。
回答を見る
  • ベストアンサー

ORA-01722: 数値が無効です

よろしくお願いします ORACLEのストアドプロシージャを実行した際、 上記のような結果が出ました。 調査した結果、ストアドプロシージャ内でのSQLで SELECT ・・・ FROM A_table WHERE A_table.a_date > 20050120 ; のようなものがあり、 A_tableのa_dateカラムが文字列型であり、 数値型との比較を行っているための エラーと確認が取れました。 しかし、 私が確認をとったのはシステムのテスト環境なのですが、 本番の環境はまったく同じプロシージャで エラーが出ていないようなのです。 なぜなのでしょうか??? 考えられる原因がある方がいらっしゃいましたら 是非教えてください。 よろしくお願いいたします。

noname#16220
noname#16220
  • Oracle
  • 回答数1
  • ありがとう数11

質問者が選んだベストアンサー

  • ベストアンサー
  • deadlock
  • ベストアンサー率67% (59/87)
回答No.1

誰かが日付のカラムに0~9以外の文字を入れているのでしょう。本番環境ではプログラムが登録(またはユーザの入力をチェックしている)ためにエラーにならずに動作しているのだと思われます。 数値変換できないレコードがないかを調べてみてください。

noname#16220
質問者

お礼

回答、遅れまして申し訳ありません。 大正解でした! 僕も一応その点には気が回り、不正値やNULLが ないかは探したのですが、ありませんでした。 そこで指摘があったのでもう一度調査 したところ、スペース埋めのレコードがありました! ありがとうございました。 またよろしくお願いいたします。 遅れたことを重ねてお詫びいたします。

関連するQ&A

  • ORA-01722: 数値が無効です

    [OSのVER]:NT4 [OracleのVER]:Oracle7 環境Oracle7、ASP 初めて投稿させていただきます。 ASPでOracleの受注表(B1JUCHU)にある担当者コード(TANTO_CD)で、担当者マスタ(B1MTANTO)から担当者名 (TANTO_NM)を取り出し、表示しようとしています。 担当者マスタには、受注表の担当者コードが全てあるわけではありません(ないものがある)。 ここで、担当者マスタに無い担当者コードがあった場合、以下のコードで次のエラーがブラウザ上に出ます。 [Oracle][ODBC][Ora]ORA-01722: 数値が無効です。 担当者マスタに担当者コードがあるレコードまでは、担当者名が表示されるのですが、担当者マスタに担当者コードが ないところでエラーがでます。 SQLの戻り値がNULLで、それを数値列へ入れようとしているため、このエラーが出ていると思うのですが、良い解決 法が思いつきません。アドバイスお願います。 strSQL = " SELECT * FROM B1JUCHU WHERE BUMON_CD = '" & Request.Form("frm1") & "'" Set oraDs = cn.Execute(strSQL) ~ strSQL2= " SELECT TANTO_NM FROM B1MTANTO WHERE TANTO_CD = " & oraDs("TANTO_CD") Set oraDs2 = cn.Execute(strSQL2) ~ <td class="TextList"><%=oraDs2("TANTO_NM") %></td>

  • Oracleのupdate文について

    OracleでテーブルB、Cを結合し取得できた項目で、テーブルAを更新したいのですがSQLがわかりません。結合結果とテーブルAは1:1にはなりません。 件数が結合結果>テーブルAの時もあれば、その逆の場合もあります。また、複数項目を更新したいです。実行して考えてみたいのですが、明朝客先ですぐに実行しなければならず(テスト環境はあるので明日そこで一旦確認後、すぐに本番環境で実行)、現在移動中→ホテル泊のため余裕がありません。 ネットで下記を見つけたのですが、更新する項目に更新日時を追加したいのと、テーブルAとの紐付けやEXISTSのWHEREはテーブルBとC両方の項目に紐づけたいです。 また、テーブルAの更新条件に、テーブルB、Cにはないcolumn③に対する条件も追加したいです。 UPDATE [TABLE①] A SET (COLUMN①, COLUMN②) = ( SELECT B.COLUMN, C.COLUMN FROM [TABLE②] B, [TABLE③] C WHERE B.COLUMN = C.COLUMN AND B.COLUMN = A.COLUMN ) WHERE EXISTS ( SELECT 1 FROM [TABLE②] B2 WHERE B2.COLUMN = A.COLUMN) もろもろとわかりづらい説明&他力本願で心苦しいのですが、どなたか教えていただけないでしょうか?

  • ストアドプロシージャの作成

    MySQLでストアドプロシージャを作成しようと試みているのですが、 分からない事があります。 引数に、テーブルのカラムを指定したいんです。 具体的には、 func(column1, 100) などとして、 select * from table where finc func(column1, 100) > 1000 tableのcolumn1には数字が入っていて、引数の100と計算をして、 1000より大きい結果を返す・・・ みたいな感じです。

    • ベストアンサー
    • MySQL
  • ORA-01438について

    OracleのPL/SQLの作成で "ORA-01438: 指定した精度を超えた値が列に指定されています"の エラーメッセージが出てしまいます。 PL/SQL上で、値が整数2桁+少数2桁 となるところを計算式を修正し 整数4桁になるようにしたところ、ORA-01438が出るようになりました。 ちなみに全てselectのはずです。 該当のカラムは副問い合わせを介してテーブルから呼んでいるのですが、 大本のカラムには精度(桁数)指定はありません。 いったいこれは何の精度指定に引っ掛かっているのでしょうか。 考えられる可能性を提示して頂けると大変助かります。

  • ストアドプロシージャでのOracle Sqlcodeの環境差異について

    ストアドプロシージャでのOracle Sqlcodeの環境差異について <質問詳細> 【事象】 ストアドプロシージャ実行時、Data Not Found時に、ふたつのOracle環境にて 異なる動作がみられました。 (1)環境A(Release 9.2.0.8.0)  NotFound時、例外が発生する(SQLCODE=100) (2)環境B(Release 9.2.0.6.0)  NotFound時、例外は発生せず、SQLCODEを判断するロジック  (下記IF SQLCODE = 0 THEN …)にすすむ。 ※実行したストアドプロシージャはSQLは以下の通り SELECT COLUMN_A, COLUMN_B, COLUMN_C INTO SP_COLUMN_A, SP_COLUMN_B, SP_COLUMN_C FROM TBL1 WHERE COLUMN_D = TBL2_SP_COLUMN_D AND ROWNUM = 1 ORDER BY COLUMN_A; IF SQLCODE = 0 THEN   :   : ELSE   :   : END IF; このような動作差異の原因としては何が考えられるでしょうか? <補足> 環境依存によるものでしょうか?(Oracleの初期化パラメータ等) それともコーディング上の問題でしょうか? べからず集などをサイトで調査中ですが、ご教示の程、宜しくお願いします。 以上です。

  • ORA-01861について

    Oracleで同一インスタンスの別スキーマに同じテーブル構成を作り開発環境としています。 そこで下記のSQL文を実行しようとすると、あるスキーマでは正常に検索されるけど別のスキーマでは 「ORA-01861 リテラルがフォーマット文字列と一致しません」 とのエラーメッセージが出力されます。 また困ったことに別マシンから同様の検索を行うとどのスキーマでも正常に検索が行われます。 Net8とかOracleクライアントの設定の問題でしょうか? DBサーバはOracle10g、クライアントは前者のマシンがOracle8i、後者のマシンにOracle9iがインストールされています。 【対象SQL文】 SELECT * FROM (SELECT TEMP.*, ROWNUM AS RM FROM (SELECT TEST.COL1, TEST.COL2 FROM TEST WHERE (COL1 = 'Dummy') AND COL2 = '1' AND DATE_COL <= '2005-11-04 12:00:00.0' -- ※この行に対して「ORA-01861」が発生しています。 ) TEMP ) WHERE RM >= 1 AND RM <= 300 ORDER BY RM /

  • T-SQLで

    SQL Server2005でストアドプロシージャを作ろうと思うのですが、カーソルにパラメータを実装できないそうで困っています。 やりたいことは、 「ワークテーブルからSELECTして、別のテーブルにINSERT or UPDATEする」 です。 ワークテーブルからSELECTするところをカーソルにするのですが、SELECT条件は可変なので、その部分をパラメータでカーソルに渡したいのです。 Oracleならできたんですが・・・。 どうすれば実現できますか?

  • ストアドプロシージャについて

    Access2003とSQL Server2005Expressです。 初歩的な質問で恐縮です。 以下のストアドプロシージャのデータ取得先を、テーブルではなく 別のストアドプロシージャにしたいのですが、 その方法がわかりません。 CREATE PROCEDURE テスト AS SELECT コード, 社名, 住所, 電話 FROM 名簿     ↑     これをテーブルではなく、別のストアドプロシージャを     指定したのですが・・・。     ここをストアドプロシージャ名にするとエラーになります。     どうすればよろしいでしょうか?

  • betweenで境界値が取得できない。

    連番の歯抜け値を取得するSQLを作りたいと思っています。 例えば、カラムAに、1,2,3,5,6,7,9,10(4と8が抜けている) と数値の入っているテーブルAがあるとします。 これに対して、 SELECT MIN(カラムA + 1) FROM テーブルA WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA) とSQLを投げた場合、4が取得できます。 これにbetween句を付与したいのですが、そうすると境界値が なぜか取れなくて困ってます。 具体的には、 SELECT MIN(カラムA + 1) FROM テーブルA WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA) AND BETWEEN 8 AND 10 とした場合、NULLが返ってきてしまいます。 普通、BETWEENは境界値も対象になるはずですが、何故このような 結果になってしまうのでしょうか? 修正点をご教授いただけないでしょうか? 宜しくお願いします。

  • テーブル名を*で検索できますか?

    同じ構造のテーブルが10個ぐらいあるのですが、 どのテーブルのカラムidに'001'が入っているかを SQLだけで検索することは可能でしょうか? 以下のようにやってみましたが駄目でした。 select * from log_0* where id='001' オラクルならできるなどでもOKです。 よろしくお願いします。