鉴于此表,
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
INT
和b
CHAR[32]
可以xcode-select --install
吗?我想不是。那么类型是如何计算的?
答案 0 :(得分:2)
在if
表达式中,else
和CASE
子句中表达式的数据类型必须兼容。因此,THEN
条款中不能ELSE
,NUMBER
条款中只有THEN
或DATE
。
但是,精度和比例不是数据类型的一部分。最好将精度和比例视为约束对表中允许的值。 VARCHAR2
与ELSE
的数据类型相同,但约束条件不应超过十位数,包括为小数部分保留的两位数,以及小数点后不超过两位数。 (然后,插入NUMBER(10,2)
仍然可以正常工作 - 但这只是因为Oracle将自动且没有警告地围绕此数字来适应列...但如果你给它输入NUMBER
,那么'没有"舍入"这将使其适合所以插入将失败)。您5.333
表达式的数据类型只是123456123456
。 (顺便说一句,在Oracle SQL中,即使CASE
是约束 - Oracle也不做整数运算!!)
NUMBER
;如果您尝试INT
,它将会失败。错误消息将告诉您精度(第一个数字)必须介于1到38之间。因此,生成NUMBER(0,0)
的任何内容听起来都像是一个错误。