特殊的物化视图刷新 (r4笔记第77天)
现在有一个需求,某个环境中存在两个用户,一个用户中存在物化视图,另一个用户中存在源表,根据业务的需要,需要做一种特别的物化视图刷新。
物化视图用户中的物化视图为CORP_NAME
源数据用户中的表为ADD_CORP_NAME
可能数据刷新是没有问题,关键就是在于CORP_NAME中的字段要比ADD_CORP_NAME多一些。
CORP_NAME
ADD_CORP_NAME
CORP_ID | CORP_ID
SYS_CREATION_DATE | SYS_CREATION_DATE
SYS_UPDATE_DATE | SYS_UPDATE_DATE
OPERATOR_ID | OPERATOR_ID
APPLICATION_ID | APPLICATION_ID
DL_SERVICE_CODE | DL_SERVICE_CODE
DL_UPDATE_STAMP | DL_UPDATE_STAMP
CORP_NAME | CORP_NAME
FUTURE1 |
FUTURE2 |
FUTURE3 |
根据开发的反馈,FUTURE1,FUTURE2,FUTURE3这三个字段的值是dummy字段,只是纯粹业务需要,但是没有实际的值。根据业务的需求,这三个字段的数据类型需要为VARCHAR2(10),VARCHAR2(20),VARCHAR2(30)
明白了大体的需求,因为表数据量很小,所以没有做特别的处理,采用全表刷新。
CREATE MATERIALIZED VIEW CORP_NAME AS SELECT
CORP_ID ,
SYS_CREATION_DATE ,
SYS_UPDATE_DATE ,
OPERATOR_ID ,
APPLICATION_ID ,
DL_SERVICE_CODE ,
DL_UPDATE_STAMP ,
CORP_NAME ,
' ' FUTURE1 ,
' ' FUTURE2 ,
' ' FUTURE3
FROM XXXX.ADD_CORP_NAME;
但是创建好之后,查看,FUTURE1,2,3的数据类型为CHAR(1),明显和需求不符。
如果这个时候做全表刷新还可以,但是刷新就会报错,
和开发做了确认,虽然这几个字段是dummy字段,但是可能会从客户端做校验,如果是char(1)很可能会有错误。
最后在查看了一些资料后,发现可以更改物化视图的数据类型。
ALTER MATERIALIZED VIEW CORP_NAME MODIFY(FUTURE1 VARCHAR2(10));
ALTER MATERIALIZED VIEW CORP_NAME MODIFY(FUTURE2 VARCHAR2(20));
ALTER MATERIALIZED VIEW CORP_NAME MODIFY(FUTURE3 VARCHAR2(30));
自己的固有思维中,物化视图的字段数据类型都是不能手动改变的,这种思维应该是从视图的认知中转移过来的。
从这个角度来看,这也是物化视图和普通视图的一大区别。至少对于视图来说我们如果要实现这种需求真是无能为力了。
最关键的部分就是刷新了,使用如下的语句做全表刷新没有问题,这个问题就告一段落了。
EXEC DBMS_MVIEW.REFRESH('CORP_NAME','C');
后续的需求就是hi定期刷新,我建议他们使用scheduler来实现,毕竟使用crontab或者外部job,shell脚本也都可以,数据库层面来说还是比较方便的。
这个问题发生在昨天,虽然问题很小,但是从中可以明白对于很多东西都需要打破固有的一些思维,不能想当然的处理问题。
- ruby学习笔记(1)--初识语法
- 无法启用数据库中的 Service Broker,因为已存在启用的具有相同 ID 的 Service Broker。
- Centos7.2下针对LDAP的完整部署记录
- .NET Core 已经实现了PHP JIT,现在PHP是.NET上的一门开发语言
- 温故而知新:设计模式之适配器模式(Adapter)
- .NET Core RC2/RTM 明确了时间表
- kvm虚拟化关闭虚拟网卡virbr0的方法
- NET开发学习项目资源(2)
- Linux下selinux简单梳理
- 一段oracle中的“复杂”分组统计sql
- 通过Chocolatey软件包管理器安装.NET Core
- rsync同步时,删除目标目录比源目录多余文件的方法(--delete)
- 近期一枚“大文娱”dawenyu.com域名以小六位价格易主
- 分布式监控系统Zabbix-3.0.3-完整安装记录(0)
- 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 数组属性和方法
- 非关系型数据库 Redis
- MyBatis 简单使用
- 数值分析常见习题解答
- Spring Web MVC 文件上传
- Leetcode 45 跳跃游戏 II (贪心+数学)
- Leetcode 第23场双周赛D 5363. 做菜顺序(DP,贪心)
- Leetcode 22. 括号生成 (括号匹配,dfs)
- MQ 系列之 ActiveMQ 介绍
- Python Tips(1) 数字与字符串之间转换,采用内置函数
- Spring Web MVC 拦截器
- Spring Web MVC 响应消息
- Codeforces Round #633 (Div. 2)D Edge Weight Assignment(构造、树的权值异或)
- Spring Web MVC 请求消息
- Codeforces Round #633 (Div. 2) A Filling Diamonds (假题,观察)
- 如何管理和组织一个机器学习项目