1

私が作成した Oracle テーブル MYTABLE には、列 COL1 があり、NUMBER(20,3); として宣言されています。小数点以下 3 桁まで有効です。このテーブルで cx_Oracle カーソルを実行すると、次のようになります。

cursor.execute('SELECT COL1 FROM MYTABLE')

cursor.description
>> [('COL1', <type 'cx_Oracle.NUMBER'>, 25, 22, 20, 3, 1)]

cursor.execute('SELECT SUM(COL1) FROM MYTABLE')

cursor.description
>> [('SUM(COL1)', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1)]

2 番目のケースでは、精度とスケールが失われています。データ自体は問題ありません (小数点以下の桁数で値が表示されます)。

どちらの場合も、期待されるデータ型を伝える信頼できる方法が必要です (クライアント UI などでデータをフォーマットする方法を決定できるようにするため)。 2 番目のケースでは許可されており、下流の UI ロジックは数値を整数としてレンダリングしますが、これは望ましくありません。

これはバグですか?もしそうなら、2番目のケースでカーソルからどのようなデータが期待できるかを明確に把握する方法はありますか?

4

1 に答える 1

2

ここに表示されているのは、精度とスケールが制限された数値に関数を適用するときに ORA-01438 エラーを回避するための Oracle の組み込みの取り組みだと思います。デフォルトでは、COL1 と COL2 の精度と位取りを式 (COL1/COL2) または AVG(COL1) に適用する必要はありません。

そのため、Oracle は、精度と位取りに制限のない一般的な NUMBER データ型を適用します。VarChar2 関数と同様のことを行うと思います。

試してみる価値があるのは、 Sum() の結果を明示的にキャストすることです。

Cast(Sum(col1) as Number(22,3))

結果の精度が 22 を超えると、次のようになります。

ORA-01438: value larger than specified precision allowed for this column

最後に、ご存じないかもしれませんが、スケールを超えてもエラーは発生しません。指定されたスケールを超えた場合、数値は可能な最大スケールに丸められます。

于 2013-05-29T18:44:00.670 に答える