web-dev-qa-db-ja.com

Oracleの暗黙的なパラメータキャスト-なぜ常に機能しないのですか? (ORA-06502エラー)

Oracle 10をDBとして使用するJava(Spring)アプリがあります。一部のレガシーコードでは、PL/SQLプロシージャのパラメータ化が間違っています。たとえば、一部の入力パラメータは、=でOracleTypes.VARCHARとして宣言されています。 Java DAOレイヤー、実際にはPL/SQLプロシージャではNUMBERです。99%の場合、これは問題なく機能します(もちろん、送信されたデータが実際に数値である場合)が、時々私はORA-06502:PL/SQL:数値または値エラー:文字から数値への変換エラーを取得してください。

問題の修正方法は理解していますが、一部のDBインストールでこれが発生し、ほとんどの場合発生しないのはなぜかと思います。レガシーコードで間違ったパラメータタイプを検査することは非常に難しいため、これは私にとって非常に重要です。

3
eagerMoose

興味深い質問-最初はオーバーフローと言っていたでしょうが、確認すると、それは_ORA-01426_であり、数値でない場合は_ORA-01722_です。デフォルトがNUMBER(38)であるのはデータ型NUMBERだけですか?

しかし、これはトレースで診断して、正確に何が起こっているかを確認できます。 セッション を識別できる場合、または 接続コードを変更する を識別できる場合は、次の操作を実行できます。

_SQL> alter session set events='6502 trace name errorstack level 12';

Session altered.

SQL> create or replace function fn_add(p1 number, p2 number) return number
  2  as
  3  v1 number(1);
  4  begin
  5  v1 := p1 + p2;
  6  return v1;
  7  end;
  8  /

Function created.

SQL> select fn_add('10', '1') from dual;
select fn_add('10', '1') from dual
       *
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: number precision too large
_

トレースファイルを調べます。

_---- Error Stack Dump -----
ORA-06502: PL/SQL: numeric or value error: number precision too large
----- Current SQL Statement for this session (sql_id=a36psfjj50bpv) -----
select fn_add('10', '1') from dual
_

これで、少なくとも根本原因の分析を開始できます。ただし、これらのトレースファイルは非常に大きくなる可能性があることに注意してください。

4
Gaius