首页 > 解决方案 > Oracle 的 CAST ON CONVERSION ERROR 是否有问题?

问题描述

我第一次尝试使用 Oracle 的CAST子句ON CONVERSION ERROR,结果不是我所期望的。

让我们从CAST没有子句开始:

SELECT CAST(123456  AS NUMBER(1,0)) FROM DUAL;

ORA-01438: "value larger than specified precision allowed for this column"

数字 123456 比NUMBER(1,0). 它不会以某种方式神奇地截断为一位数,但会引发错误。好的。这是我预期会发生的。

SELECT CAST('123456'  AS VARCHAR2(4 CHAR)) FROM DUAL;

Result = '1234'

字符串 '123456' 比VARCHAR2(4 CHAR). 它不适合。我必须承认,我预计数字会出现转换错误,而不是字符串被破坏。

SELECT CAST(123456  AS NUMBER(1,0) DEFAULT -1 ON CONVERSION ERROR) FROM DUAL;

Result: 123456

那个怎么样?突然没有问题 123456 不适合NUMBER(1,0),返回整数?

SELECT CAST('123456'  AS VARCHAR2(4 CHAR) DEFAULT 'too long' ON CONVERSION ERROR) FROM DUAL;

ORA-00907: "missing right parenthesis" at position 43

我一遍又一遍地看;我在这里看不到任何缺少的括号。

我的想法有问题吗?或者是CAST,特别是关于ON CONVERSION ERROR条款,有缺陷?

标签: oraclecastingoracle19c

解决方案


--使用TRUNC关键字转换为基准日期,

with src as( select to_date('05-APR-2021', 'DD-MON-YYYY') as sourcetest from dual union all
   select to_date('04/05/2021', 'MM/DD/YYYY') as sourcetest from dual )
seLect sourcetest 
    ,trunc(sourcetest) as trunc_date
    ,to_char(trunc(sourcetest), 'YYYY-MM-DD') as to_char_fmt
    --,validate_conversion(sourcetest as date) as test_result   --missing right parenthesis error!!!!!
from src;

推荐阅读