2

鉴于此表,

 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可以吗?我想不是。那么类型是如何计算的呢?INTbCHAR[32]

4

1 回答 1

2

CASE表达式中,THENandELSE子句中表达式的数据类型必须兼容。因此,您不能NUMBERTHEN子句中使用 a ,然后在子句中使用DATEor 。VARCHAR2ELSE

但是,精度和小数位数不是数据类型的一部分。最好将精度和比例视为对表中允许的值的约束NUMBER(10,2)是与 相同的数据类型NUMBER,但有以下约束:总位数不得超过十位,包括为小数部分保留的两位,小数点后不得超过两位。(然后,插入5.333仍然有效 - 但只是因为 Oracle 会自动且无警告地舍入此数字以适合列......但如果你给它输入123456123456,则没有“四舍五入”使其适合,因此插入将失败)。您的表达式的数据类型CASE是 simple NUMBER。(顺便提一下,在 Oracle SQL 中,evenINT是一个约束- Oracle 不做整数运算!!)

NUMBER(0,0)在 Oracle 中不存在;如果你尝试CREATE TABLE test (col NUMBER(0,0)),它会失败。错误消息将告诉您精度(第一个数字)必须在 1 到 38 之间。所以无论产生什么NUMBER(0,0)听起来都像是一个错误。

于 2016-12-22T15:35:16.600 回答