##常用的数据库功能操作
物化视图,查询DLL,定时任务
###物化视图
也叫做实例视图
【不建议使用,由于没有索引等优化手段,一旦数据量大些造成性能的问题。】
【还有个问题是在使用的时候,遇到公司的数据库主备库同步数据,这个物化视图‘很可能’倒是同步数据失败[(ノ`Д)ノ当初找了好久这个原因]】
测试代码:
CREATE MATERIALIZED VIEW VM_REPORT_OPEN_MERCHANT
BUILD IMMEDIATE --在视图编写好后创建
--更新方式COMPLETE 完全刷新 刷新时间 360分钟
REFRESH COMPLETE NEXT SYSDATE + 360/(24*60)
ENABLE QUERY REWRITE --可读
AS
select ****这里就是个查询语句****;
刷新方式 FAST 快速增量刷新,的限制太多,[统计之类的都不可以使用]只有简单到视图才可以使用的感觉。
###查询数据库DLL
就是查询数据库的表、视图、存储等的具体的创建语句等东东
#####查看表的索引等东东
SELECT DBMS_METADATA.GET_DDL(s.OBJECT_TYPE,s.OBJECT_NAME)
FROM user_objects s LEFT JOIN USER_indexes i
on s.OBJECT_NAME=i.INDEX_NAME
WHERE i.TABLE_NAME='APP_USER' OR s.OBJECT_NAME='APP_USER' ORDER BY s.OBJECT_NAME;
--APP_USER 需要查询的表的名称
#####查看 表、视图、存储等的创建语句:
SELECT DBMS_METADATA.GET_DDL('TABLE','APP_USER') as sql FROM dual; --表
SELECT DBMS_METADATA.GET_DDL('VIEW','V_APP_USER') as sql FROM dual; --视图
SELECT DBMS_METADATA.GET_DDL('MATERIALIZED_VIEW','VM_MERCHANT_TRADING') as sql FROM dual; --物化视图
SELECT DBMS_METADATA.GET_DDL('PROCEDURE','PROC_TRANSREPORT_DIRECT_MODE') as sql FROM dual; --存储过程
###数据库定时任务
#####查看启用的定时任务
select * from user_jobs;
#####停止和开启任务
begin
dbms_job.remove(1); --1任务的Job .broken(121,true); --暂停 .run(121)--启动
commit;
end;
#####创建任务
begin --每一天 凌晨1点
declare jobno number;
BEGIN
sys.dbms_job.submit(jobno,
'DELETE_OS_DATA;', --执行的存储过程名称 what
TRUNC(sysdate) + 1 +1 / (24), --next——date执行时间 可为‘’ 我通常都是写上的和下个参数一样的内容
'TRUNC(sysdate) + 1 +1 / (24)' --interval,关键设置 定时的时间字符串
);
commit;
END; end;
--参数说明:
--job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作;
--what参数是将被执行的PL/SQL代码块;
--next_date参数指识何时将运行这个工作。写Job的时候可以不指定该值;
--interval参数何时这个工作将被重执行。
实测 参数next_date不可为’’,为空的话根本一次都不会执行,next_date的值会为4000/1/1
填坑问题:定时任务在创建的时候自动执行!
原因:next_date 参数必须填写,如果没有此参数,oracle数据库默认在创建定时任务的时候会执行一次代码块,下次的执行时间才会以interval参数进行计算。
#####interval设置和示例
1、 每分钟执行 Interval => TRUNC(sysdate,’mi’) + 1 / (24*60)
这个在使用的时候作为interval参数 写法为 ‘TRUNC(sysdate,’‘mi’’) + 1 / (24*60)’
2、 每天定时执行
例如:每天的凌晨2点执行 Interval => TRUNC(sysdate) + 1 +2 / (24)
3、 每周定时执行
例如:每周一凌晨2点执行 Interval => TRUNC(next_day(sysdate,2))+2/24 --星期一,一周的第二天
4、 每月定时执行
例如:每月1日凌晨2点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24
5、 每季度定时执行
例如每季度的第一天凌晨2点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24
6、 每半年定时执行
例如:每年7月1日和1月1日凌晨2点
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24
7、 每年定时执行
例如:每年1月1日凌晨2点执行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+2/24
8、每天早上8点30分 :
‘TRUNC(SYSDATE + 1) +(860+30)/(2460)’
9、每天00:30 : TRUNC(sysdate) + 1 + 30 / (24*60)
前一半为获取系统时间 +号后面‘1’表示1天
20171104 整理 小杭
数据库:Oracle 版本不知道