对于我创建的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逻辑下游将数字渲染为整数,这是不可取的。
这是一个错误,如果是这样,有没有办法在第二种情况下明确地从光标中找出我可以期待的数据类型?
答案 0 :(得分:2)
我认为您在这里看到的是Oracle在将函数应用于精度和规模受限的数字时避免ORA-01438错误的内置工作。默认情况下,您不希望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
最后,如果您不知道,超出比例不会引发错误 - 如果超过指定比例,则数字会四舍五入到可能的最大比例。