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)]

在第二种情况下,我失去了精度和规模。数据本身很好(并显示带有小数位的值)。

我确实需要一种可靠的方法来告诉在这两种情况下期望什么数据类型(这样我就可以决定如何在客户端 UI 等上格式化我的数据)查看光标描述,您会相信小数点后没有有效数字在第二种情况下是允许的,并且我的 UI 逻辑下游将数字呈现为整数,这是不可取的。

这是一个错误吗,如果是这样,有没有办法在第二种情况下从光标中明确地找出我可以期待什么样的数据?

4

1 回答 1

2

我认为您在这里看到的是 Oracle 在将函数应用于精度和规模受限的数字时避免 ORA-01438 错误的内置努力。默认情况下,您不希望在表达式 (COL1/COL2) 或 AVG(COL1) 中应用 COL1 和 COL2 的精度和小数位数。

因此,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 回答