原文作者:Jonathan lewis
原文地址:https://jonathanlewis.wordpress.com/2020/04/24/conversion-errors/
Conversion Errors
— Jonathan Lewis @ 11:03 am BST Apr 24,2020
我想写这篇文章已经有至少三年了,今天早上我又写了一篇草稿,这是昨天的一篇关于将to_date()函数应用到日期列的危险性的文章的后续文章。但随后我看了看Oracle开发人员论坛上最近的问题,发现蒂姆·霍尔(@oraclebase)(不可避免地)已经做了必要的回复,所以我在这里留了一个简短的笔记(更多的是为了我自己的利益,而不是其他任何事情)的重点与他的网页的链接。
12.2中提供的避免转换错误的关键特性有:
- validate_conversion()函数返回1或0,具体取决于表达式是否可以使用特定的类型成功地转换为指定的类型——如果表达式的计算结果为null,则返回null。
- 扩展到通用的转换函数(例如to_date()),如果尝试的转换引起转换错误,允许使用“默认”值来替换提供的值。
代码样本-报告行,其有效日期(法语)早于今年(英语)纳税年度的开始日期:
rem
rem Script: validate_conversion.sql
rem Author: Jonathan Lewis
rem Dated: Mar 2017
rem Purpose:
rem
rem Last tested
rem 12.2.0.1
rem
create table t1 (v1 varchar2(42));
insert into t1 values('15-June-2016');
insert into t1 values('15-Juin-2016');
commit;
prompt ==================================================================
prompt Single predicate test - only rows that validate as dates in French
prompt ==================================================================
select *
from t1
where validate_conversion(v1 as date, 'dd-month-yyyy' , 'nls_date_language=french') = 1
/
prompt ===========================================================
prompt Valid French dates that are before 6th April 2017 (English)
prompt ===========================================================
select
*
from t1
where
validate_conversion(v1 as date, 'dd-month-yyyy' , 'nls_date_language=french') = 1
and to_date(v1, 'dd-month-yyyy' , 'nls_date_language=french') < to_date('06-Apr-2017','dd-mon-yyyy')
/
prompt =========================================
prompt Repeat the above with reversed predicates
prompt =========================================
select
*
from t1
where
to_date(v1, 'dd-month-yyyy' , 'nls_date_language=french') < to_date('06-Apr-2017','dd-mon-yyyy')
and validate_conversion(v1 as date, 'dd-month-yyyy' , 'nls_date_language=french') = 1
/
prompt ====================================================
prompt Repeat the above but force the order of evaluation
prompt This will raise error ORA-01843: not a invalid month
prompt ====================================================
select
/*+ ordered_predicates */
*
from t1
where
to_date(v1, 'dd-month-yyyy' , 'nls_date_language=french') < to_date('06-Apr-2017','dd-mon-yyyy')
and validate_conversion(v1 as date, 'dd-month-yyyy' , 'nls_date_language=french') = 1
/
prompt ========================================================================
prompt Handle the requirement with the 12.2 extended "to_date()" functionality
prompt ========================================================================
select
*
from
t1
where
to_date(
v1 default '06-Avril-2017' on conversion error,
'dd-month-yyyy',
'nls_date_language=french'
) < to_date(
'06-Apr-2017',
'dd-mon-yyyy',
'nls_date_language=English'
)
/
复制
是否可以保证总是在一个调用尝试在谓词中使用转换之前调用validate_conversion()函数。我对此表示怀疑,因为在手册中没有任何指示,而且Oracle也没有关于谓词执行顺序的一般保证,所以我不会冒这个险。也许唯一安全的用法是用一个CASE表达式(一个捷径)加上一个“when successful then”子句来评估实际的转换。要记住正确地处理空值,您需要多加注意。
也许可以用一个不可合并的内联视图替换该表,从而消除失败?可能不会,优化器可能仍然会执行一个简单的过滤器下推。
最后修改时间:2021-12-07 18:33:14
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
数据库国产化替代深化:DBA的机遇与挑战
代晓磊
1318次阅读
2025-04-27 16:53:22
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
799次阅读
2025-04-18 14:18:38
2025年4月国产数据库中标情况一览:4个千万元级项目,GaussDB与OceanBase大放异彩!
通讯员
794次阅读
2025-04-30 15:24:06
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
666次阅读
2025-04-15 17:24:06
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
601次阅读
2025-04-20 10:07:02
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
551次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
536次阅读
2025-04-17 17:02:24
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
511次阅读
2025-04-22 00:20:37
一页概览:Oracle GoldenGate
甲骨文云技术
502次阅读
2025-04-30 12:17:56
GoldenDB数据库v7.2焕新发布,助力全行业数据库平滑替代
GoldenDB分布式数据库
481次阅读
2025-04-30 12:17:50