c++ - 当 select 子句中使用 case 时,Oracle 数字精度和小数位数均为零

标签 c++ oracle oracle11g oracle-call-interface 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] 吗?我想不是。那么类型是如何计算的呢?

最佳答案

CASE 表达式中,THENELSE 子句中表达式的数据类型必须兼容。因此,不能在 NUMBER 子句中包含 THEN,然后在 DATE 子句中包含 VARCHAR2ELSE

但是,精度和小数位数不是数据类型的一部分。最好将精度和小数位数视为表中允许的值的约束NUMBER(10,2)NUMBER 的数据类型相同,但有限制,即总位数不得超过十位,包括为小数部分保留的两位,并且小数点后不得超过两位。 (然后,插入 5.333 仍然有效 - 但只是因为 Oracle 会自动且无警告地舍入此数字以适合该列...但是如果您给它输入 123456123456 ,则没有“舍入”使其适合,因此插入将会失败)。 CASE 表达式的数据类型就是 NUMBER 。 (顺便说一句,在 Oracle SQL 中,甚至 INT 也是一个约束 - Oracle 不进行整数算术!!)

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

关于c++ - 当 select 子句中使用 case 时,Oracle 数字精度和小数位数均为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41277695/

相关文章:

c++ - 将 boost::lockfree::spsc_queue 与分配器一起使用

c++ - 带有 Visual C++ 单元测试的 Doxygen

c++ - 确定确切的头文件

mysql - 获取表名的子查询

sql - 哪个 RDBMS 具有最丰富的 ANSI-SQL 超集?

java - 我们可以将 ojdbc14.jar 与 Oracel11g 和 jdk1.5 一起使用吗

c++ - 如果未在库类中实现,如何重载运算符?

oracle - 无法使用 confluent CLI : java. sql.SQLException 设置 CLASSPATH:找不到适合 jdbc:oracle:thin 的驱动程序

java - OracleConnection 不推荐使用的方法问题

sql - 如何根据第一列结果查询表中的不同列