如何使用数据库12.2简化数据验证代码?

简介:

无论你做了多少测试(嗯,它实际上是这样,但这是一个完全不同的问题),你几乎可以保证,在某些时刻,你那些漂亮的数据验证代码,在解析从Web表单输入的数据或从外部加载数据文件时,会弹出错误:

 


\

 

当然,这里真正令人讨厌的是,你不知道哪个列的值(假设你有多个数字列)。

 

在数据加载期间管理转换错误

 

怎么办? 当然,明智的是,在你的代码中添加大量的数据验证检查,以尝试捕获来自数据源的错误类型数据所到达的情况。很可能所有的附加验证检查将减慢插入数据的过程,但这不是一个很好的结果。

 

如果您的数据通过外部文件到达,那么您可以使用BADFILE子句捕获那些由于数据类型错误而无法加载的记录。 但是,如果插入语句的数据源是由ETL作业填充的中间表或来自网页表单的一系列值,又该怎么办?

 

如何在INSERT期间管理转换错误

Panic over - Database 12c版本2包含了对CAST和TO_xxx函数的重要更改,以管理最常见的数据转换错误。 如果存在转换错误,CAST函数现在可以返回用户指定的值。

 

例如,让我们在模式中构建一个简单的计划表:

 


\


并让我们插入一些数据,其中包括在我们尝试将值添加到目标表中时可能导致数据转换错误的值:

 


\


现在让我们试着将数据从我们的分期表插入到EMP表,看看会发生什么:

 


\

 

……毫不意外的,我得到了以下错误:

 


\

 

我可以用几种不同的方式来处理这种情况。首先,尝试并发现临时表中的哪些行和列会包含导致数据转换错误的值。为此,我将使用新的VALIDATE_CONVERSION()函数,该函数标识无法转换为所需数据类型的问题数据。如果给定的表达式可以转换为指定的数据类型,则返回1,否则返回0。

 


\

 

这将产生一个表,其中我可以轻松地选择数据转换将要成功(列值为1)和失败(列值为0)的行:

 

 

我可以使用此信息过滤临时表中的数据,因为我将其插入到我的EMP表或我可以使用INSERT INTO ... .. SELECT语句中增强的CAST和TO_xxx函数。

 

当发生数据类型转换错误时,CAST函数(以及TO_NUMBER,TO_BINARY_FLOAT,TO_BINARY_DOUBLE,TO_DATE,TO_TIMESTAMP,TO_TIMESTAMP_TZ,TO_DSINTERVAL和TO_YMINTERVAL函数)现在可以返回用户指定的值,而不是错误。这减少了数据转换和数据加载过程中的故障。

 

因此,我新的12.2版本验证SELECT语句如下所示:

 


\

 

这五行结果插入到我的EMP表中 - 显然这意味着在插入过程(行1,4,6和8)期间拒绝了第4行,因为它们包含将内容转换为empno键的一个数字错误。 这里是加载的数据:

 

 

我们可以看到在第1行,HIERDATE无效,所以它被替换为sys日期(07-JUL-16)的值。 第2行,DEPTNO的值是转换默认值99,而在第4行,MGR的值是转换默认值9999。

 

总结

 

增强的CAST函数(以及TO_NUMBER,TO_BINARY_FLOAT,TO_BINARY_DOUBLE,TO_DATE,TO_TIMESTAMP,TO_TIMESTAMP_TZ,TO_DSINTERVAL和TO_YMINTERVAL函数)可帮助您处理数据转换错误,而无需使用复杂的PL / SQL代码或在应用程序代码中写入数据验证例程。

 

新的VALIDATE_CONVERSION()函数可用于帮助您标识无法转换为所需数据类型的列值。

 

这两个功能都很有用。希望你会喜欢!

原文发布时间为:2017-03-24

本文来自云栖社区合作伙伴DBAplus

相关文章
|
2月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
141 6
|
1天前
|
SQL Java 数据库连接
JDBC编程安装———通过代码操控数据库
本文,教你从0开始学习JBCD,包括驱动包的下载安装调试设置,以及java是如何通过JBDC实现对数据库的操作,以及代码的分析,超级详细
|
27天前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
2月前
|
SQL 关系型数据库 MySQL
创建SQL数据库的基本步骤与代码指南
在信息时代,数据管理显得尤为重要,其中数据库系统已成为信息技术架构的关键部分。而当我们谈论数据库系统时,SQL(结构化查询语言)无疑是其中最核心的工具之一。本文将详细介绍如何使用SQL创建数据库,包括编写相应的代码和必要的步骤。由于篇幅限制,本文可能无法达到您要求的2000字长度,但会尽量涵盖创建数
113 3
|
2月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
210 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
3月前
|
SQL NoSQL Java
彻底革新你的数据库操作体验!Micronaut数据访问技巧让你瞬间爱上代码编写!
【9月更文挑战第10天】Java开发者们一直在寻找简化应用程序与数据库交互的方法。Micronaut作为一个现代框架,提供了多种工具和特性来提升数据访问效率。本文介绍如何使用Micronaut简化数据库操作,并提供具体示例代码。Micronaut支持JPA/Hibernate、SQL及NoSQL(如MongoDB),简化配置并无缝集成。通过定义带有`@Repository`注解的接口,可以实现Spring Data风格的命名查询。
76 6
|
4月前
|
SQL 数据库
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
这篇文章是Spring5框架的实战教程,深入讲解了如何使用JdbcTemplate进行数据库的批量操作,包括批量添加、批量修改和批量删除的具体代码实现和测试过程,并通过完整的项目案例展示了如何在实际开发中应用这些技术。
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
|
3月前
|
前端开发 数据库
数据库表设计生成代码
BizWorks ToolKit插件集成Mybatis-Plus代码生成工具,支持从数据库表生成代码,便于研发过程中数据模型变更后的代码同步。本文介绍批量生成代码的方法、配置说明及项目示例。配置文件`*.mp.yaml`用于描述生成行为,可放置于`src/main/resource/bizworks/mybatis-plus/`路径下。配置包括数据库信息、输出目录及包名等。通过IDEA右键菜单即可启动代码生成。具体配置和示例详见文档。
43 2
|
4月前
|
存储 SQL 安全
【数据库高手的秘密武器:深度解析SQL视图与存储过程的魅力——封装复杂逻辑,实现代码高复用性的终极指南】
【8月更文挑战第31天】本文通过具体代码示例介绍 SQL 视图与存储过程的创建及应用优势。视图作为虚拟表,可简化复杂查询并提升代码可维护性;存储过程则预编译 SQL 语句,支持复杂逻辑与事务处理,增强代码复用性和安全性。通过创建视图 `high_earners` 和存储过程 `get_employee_details` 及 `update_salary` 的实例,展示了二者在实际项目中的强大功能。
47 1
|
4月前
|
XML 数据库 数据格式
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
这篇文章是Spring5框架的实战教程的终结篇,介绍了如何使用注解而非XML配置文件来实现JdbcTemplate的数据库操作,包括增删改查和批量操作,通过创建配置类来注入数据库连接池和JdbcTemplate对象,并展示了完全注解开发形式的项目结构和代码实现。
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】