1

クエリ:
Select To_Number(qty) From my_table Where Id=12345;
出力:
ORA-01722: invalid number
01722. 00000 - "invalid number"

クエリ:Select qty From my_table Where Id=12345;
出力:0.00080

クエリ:
Select To_Number(0.00080) From Dual;
出力:
0.00080(エラーなし)

これは、私が Oracle で直面している奇妙な状況です。なぜそれが起こるのか誰にも示唆できますか?列qtyNUMBERタイプです。したがって、無効な番号が含まれているとは非常に想像しにくいですが、実際に発生しました。
同じ列に何千ものレコードがありますが、列の特定の値に対して発生したことを明確にしたいと思います。
さらに追加:TO_CHAR(qty)関数を使用すると、同じエラーが表示されます。qty列のNUMBER型は notVARCHAR2です。実際、SUM(qty)エラーを示した関数を使用しています。したがって、私は解剖に行き、この行が原因であることがわかりました.

4

4 に答える 4

4

それがinqtyとして定義されていると想定しています。そうでなければ、 を呼び出しても目的がありません。その仮定が正しければ、表に数値以外のデータを含む行が他にあることに賭けます。varchar2my_tableto_numberqty

SQL はセットベースの言語であるため、Oracle (または他のデータベース) は、適切と思われる順序で物事を完全に自由に評価できます。つまり、Oracle は、述語to_number(qty)を適用する前に式を完全に自由に評価できます。値を数値に変換できないid=12345行が発生した場合、Oracleはエラーをスローします。qty

特定の行に数値以外のデータid = 12345が表示されていない可能性もあります (制御文字など)。クエリを実行して確認できます

SELECT dump(qty, 1016) 
  FROM my_table
 WHERE id = 12345

(16 進数ではなく 10 進数が必要な場合は、 の 2 番目のパラメーターとして 1010 を使用しますdump)、データに予期しないものがあるかどうかを確認します。

于 2013-10-09T13:46:53.067 に答える
2

qty実際にフィールドであることを考えると、あなたが示した結果を得ることができる唯一の方法numberは、それが破損したデータを保持している場合です (そのため、その仮定について懐疑的です)。また、クライアントが先頭のゼロで値をフォーマットしていると仮定していますが、通常は表示されない末尾のゼロを強制していません。もちろん、 で強制することもできますが、to_char(.0008, '0.00000')そうしているようには見えません。それでも、先頭のゼロは私を驚かせます。

とにかく、破損を実証するために、PL/SQL を介してフィールドに無効な値を強制することができます。実際のデータや関心のあるテーブルでこれを試さないでください。

create table t42(qty number);

table T42 created.

declare
  n number;
begin
  dbms_stats.convert_raw_value('bf0901', n);
  insert into t42 (qty) values (n);
end;
/

anonymous block completed

select qty from t42;

       QTY
----------
    .00080 

select to_number(qty) from t42;

Error starting at line : 12 in command -
select to_number(qty) from t42
Error report -
SQL Error: ORA-01722: invalid number
01722. 00000 -  "invalid number"

単純なクエリでは、数値が期待どおりに表示されることに注意してください。ただし、末尾にゼロがあり、先頭にゼロはありません。実行すると、to_number()ORA-01722 がスローされます。先頭のゼロは別として、それがあなたが示したものです。

to_char()質問のタイトルのように、それも失敗します:

select to_char(qty) from t42;

Error starting at line : 13 in command -
select to_char(qty) from t42
Error report -
SQL Error: ORA-01722: invalid number

...これは理にかなっています。あなたto_number()は暗黙的な変換を行っているので、それは本当にto_number(to_char(qty))であり、実際にエラーを生成するのは暗黙的to_char()だと思います。

あなたのコメントは、データをロードおよび削除するプロセスがあることを示唆しています。それが何をしているのか、そしてそれが腐敗を引き起こしている可能性があるかどうかを正確に見ることは興味深いでしょう. 上記の PL/SQL の例のように、データベースは渡されたデータが有効であると信頼するため、この種の効果は OCI を介して実現できます。imp破損を引き起こす可能性があることを示唆するバグ レポートもあります。そのため、正確なデータベースのバージョンとプラットフォームと同様に、ロード プロセスの詳細が重要になる場合があります。

于 2013-10-09T15:55:25.510 に答える
0

これを試して:

Select To_Number(trim(qty)) From my_table Where Id=12345;
于 2013-10-09T13:41:16.083 に答える