数据迁移判断非空约束(r2笔记45天)
在数据迁移中,经常会碰到null值的问题,比如在源库中,某些列可能是null值,但是在目标库中,却有非空约束。这样在数据的迁移过程中就会发生问题。
为了更好的对数据的非空问题进行判断,我写了如下的脚本来生成检查的脚本,基本的思路就是生成动态sql,类似 select count(1) from xxx where xxx is null,如果输出结果不为0,说明在源库中存在着非空约束的问题。
脚本需要在目标库中生成,然后在源库执行即可,可以在执行的过程中,考虑加入并行等。
因为非空约束的条件在user_constraints中式long类型卡所以不能做字符串拼接等操作,就当做独立的一列来处理。
sqlplus -s n1/n1 <<EOF
set linesize 150
set feedback off
set pages 0
col search_pre format a58
col search_condition format a50
spool not_null_constraint_$1.sql_tmp
select /*+rule*/
'select count(1) from ' || table_name || ' where ' search_pre,
search_condition, ';'
from user_constraints
where table_name =upper( '$1')
and constraint_type = 'C'
and constraint_name in
(select constraint_name
from user_cons_columns
where table_name = upper('$1')
and column_name in (select column_name
from user_tab_cols
where table_name =upper( '$1')
and nullable = 'N'));
spool off;
EOF
sed 's/ NOT / /g' not_null_constraint_$1.sql_tmp > not_null_constraint_$1.sql
rm not_null_constraint_$1.sql_tmp
exit
比如对于表T来说,object_id,object_name含有非空约束。
SQL> desc t
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
OBJECT_ID NOT NULL NUMBER
OBJECT_NAME NOT NULL VARCHAR2(30)
OBJECT_TYPE VARCHAR2(19)
CLOB_TEST CLOB
运行脚本后,生成的sql脚本内容如下所示,达到了预期的目标。
select count(1) from T where "OBJECT_NAME" IS NULL ;
select count(1) from T where "OBJECT_ID" IS NULL ;
- puremvc框架之Command
- python sorted函数
- Centos 6.9下部署Oracle 11G数据库环境的操作记录
- puremvc框架之proxy
- Oracle数据库冷备份与热备份操作梳理
- Oracle数据库重做日志及归档日志的工作原理说明
- 用vs.net2010做flex/flash/as3开发
- python中input()与raw_input()的区别到底是啥?
- VB下中文URL编码问题的解决
- 让ZeGraph在X方向上填满
- 中国区块链技术和产业发展论坛举行——区块链应用发展尚需时日
- silverlight获取外部数据的另一种选择:FluorineFx
- 存储状态数据
- Oracle数据库设置为归档模式的操作方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- docker入门总结,从使用的角度谈起
- 使用 Go 语言开发 Android 应用的正确姿势探索
- Android的配置文件操作的完美封装(使用注解 反射让配置文件操作如此清晰和简单)
- Android中protobuf的使用
- 疫情监控三部曲——在STM32F103 MCU上实现(裸机版)
- Android配置文件操作模块封装,全互联网最简单好用的封装
- 使用logcat让Android应用支持查看实时日志并输出至界面显示功能
- 如何处理redis集群的hot key和big key
- 嵌入式linux之go语言开发(十一)让web服务器跑在终端上,通过网页配置终端参数
- 嵌入式linux之go语言开发(十二)参数配置文件存储模块开发
- 嵌入式linux之go语言开发(十三)LittlevGL,漂亮的嵌入式GUI的go语言绑定
- 同事问我MySQL怎么递归查询,我懵逼了...
- RocketMQ学习四-生产者producer
- 想有自己的博客吗?浏览器支持 MarkDown和语法高亮的最简单示例(使用markdown-it、highlight.js和mermaid)
- Golang--Go语言 五百行后台代码实现一简约的个人博客网站-TinyBlog