在select子句中使用case时,Oracle数字精度和比例均为零

时间:2016-12-22 07:19:49

标签: c++ oracle oracle11g oci occi

鉴于此表,

 CREATE TABLE test (
     c01  INT,
     c02  NUMBER(10,5),
     c03  NUMBER(18,10)
 );

我使用OCCI(C ++库)执行以下SELECT查询:

 select case(c01) when 10 then c02 else c03 end from test;

在这种情况下,我得到的类型代码是OCCI_SQLT_NUM,但精度和比例都是0。那(0精度和比例)是什么意思?这是一个错误吗?

在不知道精度/规模的情况下,程序的类型安全性,语义和正确性处于危险之中,因为无法决定是将其视为整数还是浮点

换句话说,CASE(x) WHEN y THEN a ELSE b表达式的类型是什么? a INTb CHAR[32]可以xcode-select --install 吗?我想不是。那么类型是如何计算的?

1 个答案:

答案 0 :(得分:2)

if表达式中,elseCASE子句中表达式的数据类型必须兼容。因此,THEN条款中不能ELSENUMBER条款中只有THENDATE

但是,精度和比例不是数据类型的一部分。最好将精度和比例视为约束对表中允许的值。 VARCHAR2ELSE的数据类型相同,但约束条件不应超过十位数,包括为小数部分保留的两位数,以及小数点后不超过两位数。 (然后,插入NUMBER(10,2)仍然可以正常工作 - 但这只是因为Oracle将自动且没有警告地围绕此数字来适应列...但如果你给它输入NUMBER,那么'没有"舍入"这将使其适合所以插入将失败)。您5.333表达式的数据类型只是123456123456。 (顺便说一句,在Oracle SQL中,即使CASE约束 - Oracle也不做整数运算!!)

Oracle中不存在

NUMBER;如果您尝试INT,它将会失败。错误消息将告诉您精度(第一个数字)必须介于1到38之间。因此,生成NUMBER(0,0)的任何内容听起来都像是一个错误。