当在Select子句中使用情况时,Oracle编号的精度和缩放为零



给定此表,

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

CASE表达式中,必须兼容THENELSE中的表达式的数据类型。因此,您在THEN子句中不能有NUMBER,然后在ELSE子句中DATEVARCHAR2

但是,精度和比例不是数据类型的一部分。最好将精度和比例视为约束在表中允许的值上。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)听起来像一个错误。

相关内容

  • 没有找到相关文章