フィールドが文字であり、数値であると想定しているため、エラーが発生します。それは、あなたがすべきではありません。フィールドを数値にしたい場合は、数値フィールドが必要です。これは一般的なルールです。このタイプの問題を回避するには、文字以外のすべての列を正しいデータ型にする必要があります。
Oracleがエラーの原因となった行を教えてくれない理由はわかりませんrowid
。ここにあるように、単純な選択でを使用すると物理的に可能である可能性があります。テーブルを結合している場合や、そのような変換関数を使用しているto_number
場合は、可能であれば、はるかに困難になります。
特にこれがOracleエラーではなくコーディングエラーである場合、Oracleは部分的にしか実装したくないと思います。
問題を解決するには、次の関数を作成します。
create or replace function is_number( Pvalue varchar2
) return number is
/* Test whether a value is a number. Return a number
rather than a plain boolean so it can be used in
SQL statements as well as PL/SQL.
*/
l_number number;
begin
-- Explicitly convert.
l_number := to_number(Pvalue);
return 1;
exception when others then
return 0;
end;
/
次のコマンドを実行して、問題のある行を見つけます。
SELECT * FROM employeesTbl WHERE is_number(active) = 0
またはこれを無視します:
SELECT *
FROM ( SELECT *
FROM employeesTbl
WHERE is_number(active) = 1 )
WHERE active = 1