资源描述:
《oracle按日期定时创建分区实例.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、oracle按日其定时创建分区实例1创建一张分区表,使用本地索引--CreatetablecreatetableTEST_DAY_INTERVAL_PARTITION(idNUMBERnotnull,time_colDATEnotnull)partitionbyrange(TIME_COL)(partitionPDEFAULTvalueslessthan(MAXVALUE)tablespaceTS_TESTpctfree10initrans1maxtrans255storage(initial64Knext1Mminex
2、tents1maxextentsunlimited));--Create/Recreateprimary,uniqueandforeignkeyconstraintsaltertableTEST_DAY_INTERVAL_PARTITIONaddconstraintPK_TEST_DAY_INTERVAL_PARTprimarykey(ID,TIME_COL)usingindexlocal;--创建本地分区索引2创建分区表存储过程CREATEORREPLACEPROCEDUREp_test_create_partitio
3、n/*ver1.0*/(p_errnoOUTNUMBER,--返回错误编号,0=成功,-1=失败p_errmsgOUTVARCHAR2--返回错误信息)ASPRAGMAAUTONOMOUS_TRANSACTION;v_exp_appEXCEPTION;v_idNUMBER;v_tablenameVARCHAR2(64);v_create_startVARCHAR2(1024);v_create_date_startdate;v_sqlstrVARCHAR2(1024);v_max_partitoinVARCHAR2(10
4、0);v_partition_nameVARCHAR2(64);BEGINv_tablename:='test_day_interval_partition';SELECT--获取目标表最大分区信息substr(MAX(partition_name),2)INTOv_max_partitoinFROMuser_tab_partitionsWHEREtable_name=upper('test_day_interval_partition')ANDpartition_name<>'PDEFAULT';v_create_st
5、art:=nvl(v_max_partitoin,to_char(trunc(SYSDATE-1),'yyyymmdd'));v_create_date_start:=to_date(v_create_start,'yyyymmdd');FORiIN1..10LOOPBEGINv_partition_name:='P'
6、
7、to_number(to_char(v_create_date_start+i,'YYYYMMDD'));v_sqlstr:='ALTERTABLE'
8、
9、v_tablename
10、
11、'SPLITPARTI
12、TIONPDEFAULTat(to_date('''
13、
14、to_char(v_create_date_start+i+1,'yyyymmdd')
15、
16、''',''yyyymmdd''))INTO(PARTITION'
17、
18、v_partition_name
19、
20、',PARTITIONPDEFAULT)';EXECUTEIMMEDIATEv_sqlstr;EXCEPTIONWHENOTHERSTHENROLLBACK;p_errmsg:='执行失败!'
21、
22、SQLERRM
23、
24、v_sqlstr;COMMIT;END;ENDLOOP;p_
25、errmsg:='';p_errno:=0;EXCEPTIONWHENOTHERSTHENIFSQLCODEIN(-14623,-14313)THEN--如果是对象已存在,不处理异常,按成功返回p_errno:=0;ELSIFSQLCODE=-54THEN--解决并发DDL时的resourcebusy错误dbms_lock.sleep(dbms_random.value(0,2));EXECUTEIMMEDIATEp_errmsg;p_errno:=0;ELSEp_errno:=-1;p_errmsg:='表'
26、
27、v_t
28、ablename
29、
30、'创建分区P'
31、
32、v_id
33、
34、'分区失败!'
35、
36、p_errmsg
37、
38、SQLERRM;ENDIF;END;1分区创建定时任务declarev_job_idnumber;beginFORjob_id_tabIN(SELECTjobFROMuser_jobsWHEREwhatLIKE'%p_test_c