给定此表,
CREATE TABLE test (
c01 INT,
c02 NUMBER(10,5),
c03 NUMBER(18,10)
);
我使用occi(c 库)执行以下选择查询:
select case(c01) when 10 then c02 else c03 end from test;
在这种情况下,我得到的Typecode是OCCI_SQLT_NUM
,但精度和比例都是0
。这是什么意思(0
精度和比例)?这是一个错误吗?
不知道程序的精度/尺度,类型安全,语义和程序的正确性是危及的,因为不可能决定是否将其视为 integer 或浮点。
换句话说,CASE(x) WHEN y THEN a ELSE b
表达式的类型是什么?a
可以是INT
和b
是CHAR[32]
吗?我想不是。那么如何计算类型?
在CASE
表达式中,必须兼容THEN
和ELSE
中的表达式的数据类型。因此,您在THEN
子句中不能有NUMBER
,然后在ELSE
子句中DATE
或VARCHAR2
。
但是,精度和比例不是数据类型的一部分。最好将精度和比例视为约束在表中允许的值上。NUMBER(10,2)
与NUMBER
是相同的数据类型,但受到限制,即总数不超过十个数字,包括为小数零件保留的两个,而小数点后不超过两个。(然后,插入5.333
仍然可以工作 - 但仅仅是因为Oracle会自动而无需警告以适合该列的情况...但是,如果您给了INPUT 123456123456
,则没有"舍入",可以使其适合插入将失败)。您的CASE
表达式的数据类型只是NUMBER
。(顺便说一下,在Oracle SQL中,即使INT
也是约束 - Oracle不做整数算术!!)
NUMBER(0,0)
在Oracle中不存在;如果您尝试使用CREATE TABLE test (col NUMBER(0,0))
,它将失败。错误消息将告诉您精度(第一个数字)必须在1到38之间。因此,生产的NUMBER(0,0)
听起来像一个错误。