1048 lines
49 KiB
MySQL
1048 lines
49 KiB
MySQL
---------------------------------------------------
|
||
-- Export file for user NMS --
|
||
-- Created by dongxiaoyan on 2014/10/31, 9:17:28 --
|
||
---------------------------------------------------
|
||
|
||
spool procedures.log
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_ADD_PART_ONE_DAY
|
||
prompt =======================================
|
||
prompt
|
||
CREATE OR REPLACE PROCEDURE pro_add_part_one_day(v_table_name IN VARCHAR2,v_par_sequence IN VARCHAR2)
|
||
Authid Current_User----使存储过程可以使用role权限
|
||
AS
|
||
-------------------------------------------------------------------------------------------------------------
|
||
--此过程的功能
|
||
-- 根据传递的参数,生成制定的表空间,自动添加分区(按天)
|
||
--当前版本:1. 0
|
||
--作 者:hyx
|
||
--日 期:2013.10.31
|
||
---
|
||
-------------------------------------------------------------------------------------------------------------
|
||
---可配置
|
||
--表空间名= 表空间名前缀 + 表名 + _ + 日期
|
||
c_table_name_prefix CONSTANT VARCHAR2(100) :=''; --不要配置,就配置为空,否长度超过最大限制,表空间名前缀(注意:一定要大写)
|
||
c_oracle_data_dir CONSTANT VARCHAR2(200) :='/data/d4/oradata/ict/nmspartition/'; --表空间文件存放的路径
|
||
c_tablespace_init_size CONSTANT VARCHAR2(10) :='10M'; --表空间初始化大小
|
||
c_tablespace_extend_size CONSTANT VARCHAR2(10) :='5M'; --表空间每次自动扩长大小
|
||
c_log_table_name CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
|
||
c_cur_pro_name CONSTANT VARCHAR2(100) :='pro_add_part_one_day'; --当前存储过程的名称
|
||
---
|
||
-------------------------------------------------------------------------------------------------------------
|
||
v_log_table_sql VARCHAR2(2000);----记录日志sql语句
|
||
---
|
||
v_last_tablespace_name_sql VARCHAR2(2000);----获取相关表最近创建的表空间名sql语句
|
||
v_last_tablespace_name VARCHAR2(200);----相关表最近创建的表空间名
|
||
---
|
||
v_tablespace_prefix_length NUMBER;----相关表最近创建的表空间名(去除日期)长度
|
||
---
|
||
v_last_tablespace_name_date NUMBER; --相关表最近创建的表空间名日期
|
||
v_next_tablespace_name_date NUMBER; --新添加表空间日期
|
||
v_create_tablespace_sql VARCHAR2(2000); --创建下一个表空间的sql语句
|
||
v_partition_time_date NUMBER; ----取分区范围值
|
||
v_add_partition_sql VARCHAR2(2000); --增加表下一个分区sql语句
|
||
v_sub_table_name VARCHAR2(200);--表名超过21时,截取后表的名字
|
||
|
||
---
|
||
-------------------------------------------------------------------------------------------------------------
|
||
BEGIN
|
||
----------------------------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'1'',''1.判断'||v_table_name||'表名长度是否大于21,如果大于,则从后往前截取21个字符 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--判断表名长度是否大于21,如果大于,则从后往前截取21个字符:因为之前定义的表有长度超过21的:22+9=31,超过最大长度了
|
||
v_sub_table_name := v_table_name;
|
||
if length(v_table_name)>21 then
|
||
v_sub_table_name := substr(v_table_name,-21);
|
||
end if;
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'2'',''2.截取前表名:'||v_table_name||',截取后表名:'||v_sub_table_name||' end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
----------------------------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'3'',''3.获取'||v_table_name||'表最近创建的表空间名 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--获取表最近创建的表空间名
|
||
v_last_tablespace_name_sql := 'select name from (select * from v$tablespace where name like''%'||c_table_name_prefix||v_sub_table_name||'_2%'''||'order by name desc ) where rownum<2';
|
||
execute immediate v_last_tablespace_name_sql into v_last_tablespace_name;
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'4'',''4.获取'||v_table_name||'表最近创建的表空间名 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
----------------------------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'5'',''5.获取'||v_table_name||'表最近创建的表空间名前缀长度+1 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--获取表最近创建的表空间名前缀长度+1
|
||
v_tablespace_prefix_length := LENGTH(CONCAT(c_table_name_prefix,v_sub_table_name)) + 2 ;
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'6'',''6.获取'||v_table_name||'表最近创建的表空间名前缀长度+1 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
----------------------------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'7'',''7.获取'||v_table_name||'表最近创建的表空间名日期(去除表空间名)begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--获取表最近创建的表空间名日期(去除表空间名)
|
||
v_last_tablespace_name_date := to_number(substr(v_last_tablespace_name, v_tablespace_prefix_length, 8));
|
||
--v_last_tablespace_name_date := to_number('20131106');--指定之前创建的最新的日期
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'8'',''8.获取'||v_table_name||'表最近创建的表空间名日期(去除表空间名):'||v_last_tablespace_name_date||' end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
----------------------------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'9'',''9.获取'||v_table_name||'表新添加表空间日期 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--新添加表空间日期
|
||
v_next_tablespace_name_date := to_char(to_date(v_last_tablespace_name_date,'yyyymmdd') + '1','yyyymmdd');
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'10'',''10.获取'||v_table_name||'表新添加表空间日期 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
----------------------------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'11'',''11.为'||v_table_name||'表创建表空间 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--创建表空间
|
||
v_create_tablespace_sql := 'CREATE BIGFILE TABLESPACE '||c_table_name_prefix||v_sub_table_name||'_'||v_next_tablespace_name_date||' DATAFILE'||''''||c_oracle_data_dir||c_table_name_prefix||v_sub_table_name||'_'||v_next_tablespace_name_date||'.dbf'||''''||' SIZE '||c_tablespace_init_size||' AUTOEXTEND ON NEXT '||c_tablespace_extend_size||' MAXSIZE UNLIMITED';
|
||
execute immediate v_create_tablespace_sql;
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'12'',''12.为'||v_table_name||'表创建表空间:'||c_table_name_prefix||v_sub_table_name||'_'||v_next_tablespace_name_date||' end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
----------------------------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'13'',''13.'||v_table_name||'表 获取下一天时间分区对应的时间 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--获取下一天时间分区对应的时间
|
||
v_partition_time_date := to_char(to_date(v_last_tablespace_name_date,'yyyymmdd') + '2','yyyymmdd');
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'14'',''14.'||v_table_name||'表 获取下一天时间分区对应的时间 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
----------------------------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'15'',''15.把表分区增加到'||v_table_name||'表 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--把表分区增加到相关表
|
||
v_add_partition_sql := 'ALTER TABLE '||v_table_name||' ADD PARTITION '||v_sub_table_name||'_' ||
|
||
v_next_tablespace_name_date || ' values less than(' ||
|
||
'to_date('''||v_partition_time_date||''','||''''||'yyyymmdd'||''''||')'|| ') TABLESPACE '||c_table_name_prefix||v_sub_table_name||'_'||v_next_tablespace_name_date;
|
||
execute immediate v_add_partition_sql;
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_par_sequence||'16'',''16.把表分区'||v_sub_table_name||'_' ||v_next_tablespace_name_date||'增加到'||v_table_name||'表 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
----------------------------------------------------------
|
||
EXCEPTION
|
||
--异常处理机制,记录相关的ora错误号以及相关异常信息
|
||
WHEN OTHERS THEN
|
||
BEGIN
|
||
ROLLBACK;
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''-1'',''error:'||SQLERRM||''')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
--ROLLBACK;
|
||
END;
|
||
|
||
END;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_CREATEINDEX
|
||
prompt ==================================
|
||
prompt
|
||
create or replace procedure pro_createIndex(tabName IN VARCHAR2,fileds IN VARCHAR2) is
|
||
---
|
||
c_log_table_name CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
|
||
c_cur_pro_name CONSTANT VARCHAR2(100) :='pro_createIndex'; --当前存储过程的名称
|
||
---
|
||
v_log_table_sql VARCHAR2(5000);
|
||
sposition1 INTEGER;
|
||
sposition2 INTEGER;
|
||
mysubstr VARCHAR2(100);
|
||
starttimes INTEGER;
|
||
splitStr VARCHAR2(10);
|
||
v_sql1 VARCHAR2(100);
|
||
begin
|
||
starttimes := 1;
|
||
sposition1 := 1;
|
||
splitStr := ':';
|
||
loop
|
||
sposition2 := instr(fileds, splitStr, 1, starttimes);
|
||
mysubstr := substr(fileds, sposition1, sposition2 - sposition1);
|
||
|
||
if mysubstr is null
|
||
then
|
||
exit;
|
||
end if;
|
||
|
||
v_sql1:='create index '||tabName||'_'||starttimes ||' on '||tabName||'('||mysubstr||') local';
|
||
EXECUTE IMMEDIATE v_sql1;
|
||
|
||
sposition1 := sposition2 + 1;
|
||
starttimes := starttimes + 1;
|
||
dbms_output.put_line(mysubstr);
|
||
|
||
exit when sposition2 = 0;
|
||
end loop;
|
||
dbms_output.put_line('end');
|
||
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
BEGIN
|
||
ROLLBACK;
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''-1'',''error:'||SQLERRM||''')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
END;
|
||
end;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_CREATEQUTESPACE
|
||
prompt ======================================
|
||
prompt
|
||
create or replace procedure PRO_CREATEQUTESPACE(spaceName IN VARCHAR2,spacePath IN VARCHAR2)
|
||
Authid Current_User----使存储过程可以使用role权限
|
||
is
|
||
space_sql VARCHAR2(5000);
|
||
execParm number;
|
||
proexecinfoid number;
|
||
execption_sql VARCHAR2(5000);
|
||
|
||
begin
|
||
execParm := 0;
|
||
space_sql :='create tablespace '||spaceName||' datafile '''||spacePath||''' size 50M autoextend on default storage(initial 10M next 10M minextents 1 maxextents unlimited pctincrease 1)';
|
||
execParm := 1;
|
||
EXECUTE IMMEDIATE space_sql;
|
||
--EXECUTE IMMEDIATE 'create tablespace '||spaceName||' datafile '''||spacePath||''' size 50M default
|
||
-- storage(initial 10M next 10M minextents 1 maxextents unlimited pctincrease 1)';
|
||
--execParm := 2;
|
||
EXCEPTION WHEN OTHERS THEN
|
||
select SEQ_PROEXECINFO.NEXTVAL into proexecinfoid from dual;
|
||
execption_sql := 'insert into PROEXECINFO(ID,proname,param,prodesc) values('||proexecinfoid||',''PRO_CREATEQUTESPACE'','||execParm||','''||to_char(sysdate,'YYYY-MM-DD HH:MI')||spaceName||spacePath||''')';
|
||
EXECUTE IMMEDIATE execption_sql;
|
||
--
|
||
--dbms_output.put_line(sqlerrm);
|
||
--ROLLBACK;
|
||
end PRO_CREATEQUTESPACE;
|
||
--end;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_CREATESEQ
|
||
prompt ================================
|
||
prompt
|
||
create or replace procedure pro_createSeq(tabName IN VARCHAR2) is
|
||
---
|
||
c_log_table_name CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
|
||
c_cur_pro_name CONSTANT VARCHAR2(100) :='pro_createSeq'; --当前存储过程的名称
|
||
---
|
||
v_log_table_sql VARCHAR2(5000);
|
||
v_sql1 VARCHAR2(5000);
|
||
begin
|
||
v_sql1 :='create sequence SEQ_'||tabName||'
|
||
minvalue 1
|
||
maxvalue 999999999999
|
||
start with 1
|
||
increment by 1
|
||
cache 20
|
||
cycle
|
||
order';
|
||
--将创建seq的sql语句存入日志表
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''1'',''1.创建SEQ的SQL语句:'||v_sql1||''')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
EXECUTE IMMEDIATE v_sql1;
|
||
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
BEGIN
|
||
ROLLBACK;
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''-1'',''error:'||SQLERRM||''')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
END;
|
||
end pro_createSeq;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_CREATETRIGGER
|
||
prompt ====================================
|
||
prompt
|
||
create or replace procedure pro_createTrigger(tabName IN VARCHAR2) is
|
||
---
|
||
c_log_table_name CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
|
||
c_cur_pro_name CONSTANT VARCHAR2(100) :='pro_createTrigger'; --当前存储过程的名称
|
||
---
|
||
v_log_table_sql VARCHAR2(5000);
|
||
v_sql1 VARCHAR2(5000);
|
||
begin
|
||
v_sql1 :='Create Or Replace Trigger B_I_'||tabName ||' before insert on '||tabName||' for each row
|
||
declare
|
||
|
||
begin
|
||
if ( :new.id is null ) --insert
|
||
then
|
||
select seq_'||tabName ||'.nextVal into :new.id from dual;
|
||
end if;
|
||
end B_I_'||tabName||';';
|
||
--将创建触发器的sql语句存入日志表
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''1'',''1.创建触发器的SQL语句:'||v_sql1||''')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
EXECUTE IMMEDIATE v_sql1;
|
||
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
BEGIN
|
||
ROLLBACK;
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''-1'',''error:'||SQLERRM||''')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
END;
|
||
end pro_createTrigger;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_CREATETABLE
|
||
prompt ==================================
|
||
prompt
|
||
create or replace procedure pro_createTable(tabName IN VARCHAR2,filedAndType IN VARCHAR2,indexfileds in varchar2)
|
||
Authid Current_User----使存储过程可以使用role权限
|
||
is
|
||
---
|
||
c_oracle_data_dir CONSTANT VARCHAR2(200) :='/data/d4/oradata/ict/nmspartition/'; --表空间文件存放的路径
|
||
c_tablespace_init_size CONSTANT VARCHAR2(10) :='10M'; --表空间初始化大小
|
||
c_tablespace_extend_size CONSTANT VARCHAR2(10) :='5M'; --表空间每次自动扩长大小
|
||
c_log_table_name CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
|
||
c_cur_pro_name CONSTANT VARCHAR2(100) :='pro_createTable'; --当前存储过程的名称
|
||
---
|
||
v_create_tablespace_sql VARCHAR2(5000);
|
||
v_log_table_sql VARCHAR2(5000);
|
||
v_sql1 VARCHAR2(5000);
|
||
---
|
||
part_time VARCHAR2(64);--第一个分区的后缀名
|
||
part_time_format VARCHAR2(64);--第一个分区的时间比较字符串
|
||
part_time2 VARCHAR2(64);--第二个分区的后缀名
|
||
part_time2_format VARCHAR2(64);--第二个分区的时间比较字符串
|
||
begin
|
||
---------------------------------------
|
||
--修改为按天分区后的修改
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''1'',''1.创建以表名命名的表空间(用于主键索引) begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--创建以表名命名的表空间(用于主键索引)
|
||
v_create_tablespace_sql := 'CREATE BIGFILE TABLESPACE '||tabName||' DATAFILE '''||c_oracle_data_dir||tabName||'.dbf'' SIZE '||c_tablespace_init_size||' AUTOEXTEND ON NEXT '||c_tablespace_extend_size||' MAXSIZE UNLIMITED';
|
||
execute immediate v_create_tablespace_sql;
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''2'',''2.创建以表名命名的表空间(用于主键索引) end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
---------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''3'',''3.查询当前时间 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--查询当前时间
|
||
select to_char(sysdate,'yyyyMMdd') into part_time from dual;
|
||
select to_char(sysdate,'yyyy-MM-dd HH24:MI:SS') into part_time_format from dual;
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''4'',''4.查询当前时间:'||part_time||' end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
---------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''5'',''5.创建第一个分区的表空间 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--创建第一个分区的表空间
|
||
v_create_tablespace_sql := 'CREATE BIGFILE TABLESPACE '||tabName||'_'||part_time||' DATAFILE '''||c_oracle_data_dir||tabName||'_'||part_time||'.dbf'' SIZE '||c_tablespace_init_size||' AUTOEXTEND ON NEXT '||c_tablespace_extend_size||' MAXSIZE UNLIMITED';
|
||
execute immediate v_create_tablespace_sql;
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''6'',''6.创建第一个分区的表空间 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
---------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''7'',''7.查询第二天的时间 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--查询第二天的时间,避免错过定时创建分区的执行时间
|
||
select to_char(sysdate+1,'yyyyMMdd') into part_time2 from dual;
|
||
select to_char(sysdate+1,'yyyy-MM-dd HH24:MI:SS') into part_time2_format from dual;
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''8'',''8.查询第二天的时间:'||part_time2||' end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
---------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''9'',''9.创建第二个分区的表空间 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--创建第二个分区的表空间
|
||
v_create_tablespace_sql := 'CREATE BIGFILE TABLESPACE '||tabName||'_'||part_time2||' DATAFILE '''||c_oracle_data_dir||tabName||'_'||part_time2||'.dbf'' SIZE '||c_tablespace_init_size||' AUTOEXTEND ON NEXT '||c_tablespace_extend_size||' MAXSIZE UNLIMITED';
|
||
execute immediate v_create_tablespace_sql;
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''10'',''10.创建第二个分区的表空间 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
--------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''11'',''11.建表 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--建表
|
||
v_sql1 :='create table '||tabName ||'(id number not null primary key,detection_info_id number not null ,'||filedAndType||',DETECTIONED_STATE varchar(2),SEQ_ID number,DETECTION_SET_INFO_ID number,data_check_time DATE,data_arrive_time DATE,data_check_time_digital number,data_arrive_time_digital number,foreign KEY(detection_info_id) REFERENCES detection_info(id))'||
|
||
'partition by range(DATA_CHECK_TIME)'||'(partition '||tabName||'_'||part_time||' values less than(to_date('''||part_time_format||''',''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')) tablespace '||tabName||'_'||part_time||' storage(initial 10M next 10M maxextents unlimited ),'||
|
||
'partition '||tabName||'_'||part_time2||' values less than(to_date('''||part_time2_format||''',''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')) tablespace '||tabName||'_'||part_time2||' storage(initial 10M next 10M maxextents unlimited ))';
|
||
EXECUTE IMMEDIATE v_sql1;
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''12'',''12.建表 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
---------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''13'',''13.创建seq begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--创建seq
|
||
pro_createSeq(tabName);
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''14'',''14.创建seq end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
---------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''15'',''15.创建触发器 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--创建触发器
|
||
pro_createTrigger(tabName);
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''16'',''16.创建触发器 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
---------------------------------------
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''17'',''17.创建索引 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--创建索引
|
||
pro_createindex(tabName,indexfileds);
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''18'',''18.创建索引 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
----------------------------------------
|
||
EXCEPTION
|
||
--异常处理机制,记录相关的ora错误号以及相关异常信息
|
||
WHEN OTHERS THEN
|
||
BEGIN
|
||
ROLLBACK;
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''-1'',''error:'||SQLERRM||''')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
END;
|
||
end pro_createTable;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_CREATEWEEKSPACE
|
||
prompt ======================================
|
||
prompt
|
||
create or replace procedure PRO_CREATEWEEKSPACE(spaceName IN VARCHAR2,spacePath IN VARCHAR2)
|
||
Authid Current_User----使存储过程可以使用role权限
|
||
is
|
||
space_sql VARCHAR2(5000);
|
||
execParm number;
|
||
proexecinfoid number;
|
||
execption_sql VARCHAR2(5000);
|
||
|
||
begin
|
||
execParm := 0;
|
||
space_sql :='create tablespace '||spaceName||' datafile '''||spacePath||''' size 100M autoextend on default storage(initial 100M next 10M minextents 1 maxextents unlimited pctincrease 1)';
|
||
--space_sql :='create tablespace '||spaceName||' datafile '''||spacePath||''' size 100M autoextend on next 10M maxsize unlimited ';
|
||
execParm := 1;
|
||
EXECUTE IMMEDIATE space_sql;
|
||
--EXECUTE IMMEDIATE 'create tablespace '||spaceName||' datafile '''||spacePath||''' size 50M default
|
||
-- storage(initial 10M next 10M minextents 1 maxextents unlimited pctincrease 1)';
|
||
--execParm := 2;
|
||
EXCEPTION WHEN OTHERS THEN
|
||
select SEQ_PROEXECINFO.NEXTVAL into proexecinfoid from dual;
|
||
execption_sql := 'insert into PROEXECINFO(ID,proname,param,prodesc) values('||proexecinfoid||',''PRO_CREATEQUTESPACE'','||execParm||','''||to_char(sysdate,'YYYY-MM-DD HH:MI')||spaceName||spacePath||''')';
|
||
EXECUTE IMMEDIATE execption_sql;
|
||
--
|
||
--dbms_output.put_line(sqlerrm);
|
||
--ROLLBACK;
|
||
end PRO_CREATEWEEKSPACE;
|
||
--end;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_RECORD_LOG_INFO
|
||
prompt ======================================
|
||
prompt
|
||
create or replace procedure PRO_RECORD_LOG_INFO(log_table_name in VARCHAR2,id in number, proname in VARCHAR2, sequence in VARCHAR2,log_cont in VARCHAR2)
|
||
is
|
||
v_log_table_sql VARCHAR2(2000);----记录日志sql语句
|
||
pragma autonomous_transaction;
|
||
begin
|
||
v_log_table_sql := 'INSERT INTO '||log_table_name||'(id,proname,sequence,log_cont) VALUES('||id||','''||proname||''','''||sequence||''','''||log_cont||''')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
end PRO_RECORD_LOG_INFO;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_DEL_PART_BY_DAY
|
||
prompt ======================================
|
||
prompt
|
||
create or replace procedure pro_del_part_by_day(v_table_name IN VARCHAR2,v_par_sequence IN VARCHAR2,v_partition_name IN VARCHAR2)
|
||
Authid Current_User----使存储过程可以使用role权限
|
||
AS
|
||
-------------------------------------------------------------------------------------------------------------
|
||
|
||
--此过程的功能
|
||
--每次执行可以自动自动删除分区,删除指定的表空间,(按天)
|
||
--当前版本:1. 0
|
||
--作 者:hyx
|
||
--日 期:2013.11.01
|
||
---
|
||
-------------------------------------------------------------------------------------------------------------
|
||
--变量声明
|
||
----表空间名= 表空间名前缀 + 表名 + _ + 日期
|
||
c_table_name_prefix CONSTANT VARCHAR2(100) :=''; ----表空间名前缀(注意:一定要大写)
|
||
c_log_table_name CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
|
||
c_cur_pro_name CONSTANT VARCHAR2(100) :='pro_del_part_by_day'; --当前存储过程的名称
|
||
-------------------------------------------------------------------------------------------------------------
|
||
--v_log_table_sql VARCHAR2(2000);----记录日志sql语句
|
||
v_del_partition_sql VARCHAR2(2000); --删除分区sql语句
|
||
v_log_id NUMBER;--日志记录id
|
||
|
||
-------------------------------------------------------------------------------------------------------------
|
||
BEGIN
|
||
|
||
----------------------------------------------------------
|
||
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,v_par_sequence||'3','3.删除'||v_table_name||'表分区 begin');
|
||
|
||
|
||
----删除指定表分区
|
||
v_del_partition_sql := 'alter table '||v_table_name||' drop partition '||v_partition_name||' update indexes';
|
||
|
||
execute immediate v_del_partition_sql;
|
||
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,v_par_sequence||'4','4.删除'||v_table_name||'表分区 end');
|
||
|
||
-------------------------- --------------------------------
|
||
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,v_par_sequence||'5','5.删除'||v_table_name||'表 表空间 begin');
|
||
|
||
|
||
----删除指定表空间
|
||
execute immediate 'drop tablespace '||c_table_name_prefix||v_partition_name||' including contents and datafiles';
|
||
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,v_par_sequence||'6','6.删除'||v_table_name||'表 表空间 end');
|
||
|
||
|
||
----------------------------------------------------------
|
||
EXCEPTION
|
||
--异常处理机制,记录相关的ora错误号以及相关异常信息
|
||
WHEN OTHERS THEN
|
||
BEGIN
|
||
ROLLBACK;
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,'-1','error:'||SQLERRM);
|
||
|
||
END;
|
||
END pro_del_part_by_day;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_DELTABSPACE
|
||
prompt ==================================
|
||
prompt
|
||
create or replace procedure PRO_DELTABSPACE(v_par_sequence IN VARCHAR2,v_cur_sql IN VARCHAR2)
|
||
Authid Current_User----使存储过程可以使用role权限
|
||
is
|
||
--------------------------------------------------------------
|
||
--可配置
|
||
c_log_table_name CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
|
||
c_cur_pro_name CONSTANT VARCHAR2(100) :='PRO_DELTABSPACE'; --当前存储过程的名称
|
||
|
||
--变量
|
||
v_table_name VARCHAR2(2000); --表名
|
||
v_partition_name VARCHAR2(2000); --表分区名
|
||
v_sequence_count NUMBER :=0; --此存储过程的步骤编号
|
||
v_full_sequence VARCHAR2(100);--步骤编号全称
|
||
--v_log_table_sql VARCHAR2(2000);----记录日志sql语句
|
||
v_log_id NUMBER;--日志记录id
|
||
--游标
|
||
type cur_type is ref cursor;
|
||
cur cur_type;
|
||
CT_COLUMNS user_tab_partitions%ROWTYPE;--定义CT_COLUMNS:表名%rowtype 或者游标名%rowtype
|
||
--------------------------------------------------------------
|
||
BEGIN
|
||
OPEN cur for v_cur_sql;
|
||
|
||
LOOP
|
||
v_sequence_count := v_sequence_count + 1;
|
||
FETCH cur INTO CT_COLUMNS;
|
||
EXIT WHEN cur%NOTFOUND;
|
||
--------------------------------------------------------------
|
||
v_table_name :=CT_COLUMNS.table_name;--表名
|
||
v_partition_name :=CT_COLUMNS.partition_name;--表分区名
|
||
|
||
v_full_sequence := v_par_sequence||v_sequence_count;
|
||
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,v_full_sequence,v_sequence_count||'.删除'||v_table_name||'表指定的表空间和表分区 begin');
|
||
|
||
|
||
--删除detection_info表指定的表空间和表分区
|
||
pro_del_part_by_day(v_table_name,v_full_sequence||'_',v_partition_name);
|
||
|
||
v_sequence_count := v_sequence_count + 1;
|
||
v_full_sequence := v_par_sequence||v_sequence_count;
|
||
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,v_full_sequence,v_sequence_count||'.删除'||v_table_name||'表指定的表空间和表分区 end');
|
||
|
||
--------------------------------------------------------------
|
||
END LOOP;
|
||
CLOSE cur;
|
||
EXCEPTION
|
||
--异常处理机制,记录相关的ora错误号以及相关异常信息
|
||
WHEN OTHERS THEN
|
||
BEGIN
|
||
ROLLBACK;
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,'-1','error:'||SQLERRM);
|
||
END;
|
||
END PRO_DELTABSPACE;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_DELTABSPACE_NAME
|
||
prompt =======================================
|
||
prompt
|
||
create or replace procedure PRO_DELTABSPACE_NAME(tempstr IN VARCHAR2,user_name IN VARCHAR2,tablename IN VARCHAR2)
|
||
Authid Current_User
|
||
----使存储过程可以使用role权限
|
||
is
|
||
space_sql VARCHAR2(5000);
|
||
--execParm number;
|
||
proexecinfoid number;
|
||
|
||
begin
|
||
-- execParm := 1;
|
||
space_sql :='alter table '||user_name||'.'||tablename||' drop partition '||tempstr||' update indexes';
|
||
-- execParm := 2;
|
||
EXECUTE IMMEDIATE space_sql;
|
||
-- execParm := 3;
|
||
--EXCEPTION
|
||
--WHEN OTHERS THEN
|
||
-- dbms_output.put_line(sqlerrm);
|
||
-- ROLLBACK;
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
select SEQ_PROEXECINFO.NEXTVAL into proexecinfoid from dual;
|
||
-- EXECUTE IMMEDIATE 'insert into PROEXECINFO(ID,proname,param,prodesc) values(seq_proexecinfo.nextval,''PRO_DELTABSPACE'','||CT_COLUMNS.segment_name||','''||to_char(sysdate,'YYYY-MM-DD HH:MI')||CT_COLUMNS.segment_name||tempstr||space_sql||''')';
|
||
dbms_output.put_line(sqlerrm);
|
||
ROLLBACK;
|
||
end PRO_DELTABSPACE_NAME;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_DEL_WEEK_TABSPACE
|
||
prompt ========================================
|
||
prompt
|
||
create or replace procedure PRO_DEL_WEEK_TABSPACE(tempstr IN VARCHAR2,user_name IN VARCHAR2)
|
||
Authid Current_User----使存储过程可以使用role权限
|
||
is
|
||
space_sql VARCHAR2(5000);
|
||
--execParm number;
|
||
proexecinfoid number;
|
||
--extendtabName VARCHAR2(30);--要添加新分区的表
|
||
--游标
|
||
--从监测类别定义表中查询出已经创建的自定义监测类别表
|
||
Cursor cur is
|
||
--SELECT distinct x.table_name
|
||
-- FROM dba_tab_partitions x, dba_tab_partitions y
|
||
--- WHERE x.tablespace_name =tempstr AND y.tablespace_name <> tempstr AND x.table_name=y.table_name
|
||
-- order by x.table_name;
|
||
select distinct segment_name from user_extents where SEGMENT_TYPE='TABLE PARTITION' AND partition_name = tempstr and segment_name <> 'DETECTION_INFO';
|
||
--select distinct segment_name from user_extents where partition_name = tempstr and segment_name <> 'DETECTION_INFO';
|
||
-- select segment_name from dba_segments where tablespace_name = tempstr and segment_type like '%TABLE%';
|
||
CT_COLUMNS cur%ROWTYPE;
|
||
begin
|
||
OPEN cur();
|
||
LOOP
|
||
FETCH cur INTO CT_COLUMNS;
|
||
EXIT WHEN cur%NOTFOUND;
|
||
-- execParm := 1;
|
||
space_sql :='alter table '||user_name||'.'||CT_COLUMNS.segment_name||' drop partition '||tempstr||' update indexes';
|
||
|
||
-- execParm := 2;
|
||
EXECUTE IMMEDIATE space_sql;
|
||
-- execParm := 3;
|
||
--EXCEPTION
|
||
--WHEN OTHERS THEN
|
||
-- dbms_output.put_line(sqlerrm);
|
||
-- ROLLBACK;
|
||
end LOOP;
|
||
CLOSE cur;
|
||
-- EXCEPTION
|
||
-- WHEN OTHERS THEN
|
||
-- select SEQ_PROEXECINFO.NEXTVAL into proexecinfoid from dual;
|
||
-- EXECUTE IMMEDIATE 'insert into PROEXECINFO(ID,proname,param,prodesc) values(seq_proexecinfo.nextval,''PRO_DEL_WEEK_TABSPACE'','||CT_COLUMNS.segment_name||','''||to_char(sysdate,'YYYY-MM-DD HH:MI')||CT_COLUMNS.segment_name||tempstr||space_sql||''')';
|
||
-- dbms_output.put_line(sqlerrm);
|
||
-- ROLLBACK;
|
||
end PRO_DEL_WEEK_TABSPACE;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_DEL_PARTITION
|
||
prompt ====================================
|
||
prompt
|
||
create or replace procedure pro_del_Partition
|
||
Authid Current_User----使存储过程可以使用role权限
|
||
is
|
||
C_DATE VARCHAR2(64);
|
||
tempstr VARCHAR2(64);
|
||
user_name VARCHAR2(64);
|
||
--space_path varchar2(1000); --存储过程上次执行的时间
|
||
--end_date VARCHAR2(32);--要添加新分区的表
|
||
space_sql VARCHAR2(1024);
|
||
begin
|
||
|
||
--获取系统当前年
|
||
select to_char(sysdate+7, 'yyyy') into C_DATE from dual;
|
||
--获取系统下一周
|
||
select to_char(sysdate+7, 'iw') into tempstr from dual;
|
||
--如果当前新建的周是一年的第一周则,年为上一年
|
||
if tempstr = 1
|
||
then select to_char(sysdate-7, 'yyyy') into C_DATE from dual;
|
||
end if;
|
||
--要删除的是7周前的分区
|
||
--tempstr := to_number(tempstr)-7;
|
||
select to_char(sysdate-6*12, 'iw') into tempstr from dual;
|
||
--要删除分区的名称组合
|
||
tempstr := 'DI_W'||C_DATE||''||tempstr;
|
||
--tempstr := 'DI_W201341';
|
||
user_name := 'NMS';
|
||
--到了表空间使用要过期之前,建立新的表空间之后删除旧的表空间:
|
||
--一、删除使用该表空间的表
|
||
PRO_DEL_WEEK_TABSPACE(tempstr,'NMS');
|
||
--space_sql :='alter table '||user_name||'.DETECTION_INFO drop partition '||tempstr||' update indexes';
|
||
|
||
--二、暂时停用被用作外键表的外键
|
||
--alter table NMS.detection_info disable primary key cascade;
|
||
|
||
space_sql :='alter table '||user_name||'.detection_info disable primary key cascade';
|
||
EXECUTE IMMEDIATE space_sql;
|
||
|
||
--三、删除包含外键表的分区
|
||
--alter table NMS.detection_info drop partition '||tempstr||' update indexes;
|
||
--alter table NMS.detection_info drop partition '||tempstr||' including contents;
|
||
space_sql :='alter table '||user_name||'.detection_info drop partition '||tempstr||' update indexes ';
|
||
|
||
EXECUTE IMMEDIATE space_sql;
|
||
--四、恢复被用作外键表的外键
|
||
--alter table '||user_name||'.detection_info enable primary key;
|
||
--alter index /*nms.detection_info.*/SYS_C0010650 rebuild;
|
||
|
||
space_sql :='alter table '||user_name||'.detection_info enable primary key';
|
||
EXECUTE IMMEDIATE space_sql;
|
||
|
||
--五、删除分区
|
||
--drop tablespace '||tempstr||' including contents and datafiles cascade constraints update indexes;
|
||
space_sql :='drop tablespace '||tempstr||' including contents and datafiles';--and datafiles cascade constraints update indexes;
|
||
EXECUTE IMMEDIATE space_sql;
|
||
|
||
end pro_del_Partition;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_EXTENDTABSPACE
|
||
prompt =====================================
|
||
prompt
|
||
create or replace procedure PRO_EXTENDTABSPACE(v_par_sequence IN VARCHAR2)
|
||
Authid Current_User----使存储过程可以使用role权限
|
||
is
|
||
----------------------------------------------------------
|
||
|
||
--可配置
|
||
c_cur_pro_name CONSTANT VARCHAR2(100) :='PRO_EXTENDTABSPACE'; --当前存储过程的名称
|
||
c_log_table_name CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
|
||
--变量
|
||
v_table_name VARCHAR2(2000); --表名
|
||
v_sequence_count NUMBER:=0 ; --此存储过程的步骤编号
|
||
v_full_sequence VARCHAR2(100);--步骤编号全称
|
||
v_log_table_sql VARCHAR2(2000);----记录日志sql语句
|
||
|
||
--游标
|
||
--从监测类别定义表中查询出已经创建的自定义监测类别表
|
||
--需要从表对象中查看,表是否创建,没创建的说明标识有问题,实际没创建表,就不用创建分区
|
||
Cursor cur is
|
||
select distinct cti.table_name extendtabName
|
||
from check_type_info cti
|
||
left join user_tables ut on ut.table_name = cti.table_name
|
||
where cti.crete_state = 0 and ut.table_name is not null;
|
||
CT_COLUMNS cur%ROWTYPE;
|
||
|
||
-----------------------------------------------------------
|
||
BEGIN
|
||
OPEN cur();
|
||
LOOP
|
||
v_sequence_count := v_sequence_count + 1;
|
||
FETCH cur
|
||
INTO CT_COLUMNS;
|
||
EXIT WHEN cur%NOTFOUND;
|
||
-------------------------------------------------------------
|
||
v_table_name :=CT_COLUMNS.extendtabName;--表名
|
||
v_full_sequence := v_par_sequence||v_sequence_count;
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_full_sequence||''','''||v_sequence_count||'.为'||v_table_name||'表创建表空间和表分区 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--为detection_info表创建表空间和表分区
|
||
pro_add_part_one_day(v_table_name,v_full_sequence||'_');
|
||
|
||
v_sequence_count := v_sequence_count + 1;
|
||
v_full_sequence := v_par_sequence||v_sequence_count;
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''','''||v_full_sequence||''','''||v_sequence_count||'.为'||v_table_name||'表创建表空间和表分区 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql ;
|
||
COMMIT;
|
||
---------------------------------------------------------------
|
||
END LOOP;
|
||
CLOSE cur;
|
||
EXCEPTION
|
||
--异常处理机制,记录相关的ora错误号以及相关异常信息
|
||
WHEN OTHERS THEN
|
||
BEGIN
|
||
ROLLBACK;
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''-1'',''error:'||SQLERRM||')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
--ROLLBACK;
|
||
END;
|
||
END;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_DRIVER_ADD_PARTITION
|
||
prompt ===========================================
|
||
prompt
|
||
create or replace procedure pro_driver_add_Partition
|
||
Authid Current_User----使存储过程可以使用role权限
|
||
IS
|
||
-------------------------------------------------------------------------------------------------------------
|
||
|
||
--此过程的功能:
|
||
-- 每次执行可以自动生成制定的表空间,自动添加分区(按天)
|
||
--当 前 版 本:1. 0
|
||
--作 者:hyx
|
||
--日 期:2013.10.31
|
||
-------------------------------------------------------------------------------------------------------------
|
||
---可配置
|
||
c_log_table_name CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
|
||
c_cur_pro_name CONSTANT VARCHAR2(100) :='pro_driver_add_Partition'; --当前存储过程的名称
|
||
---
|
||
-------------------------------------------------------------------------------------------------------------
|
||
---
|
||
v_log_table_sql VARCHAR2(2000);----记录日志sql语句
|
||
v_table_name VARCHAR2(2000); --表名--表名一定要大写
|
||
-------------------------------------------------------------------------------------------------------------
|
||
|
||
BEGIN
|
||
--为固定表创建表空间及分区
|
||
-----------------------------------------------------------
|
||
v_table_name :='DETECTION_INFO';
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''1'',''1.为'||v_table_name||'表创建表空间和表分区 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--为detection_info表创建表空间和表分区
|
||
pro_add_part_one_day(v_table_name,'1_');
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''2'',''2.为'||v_table_name||'表创建表空间和表分区 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
-----------------------------------------------------------
|
||
v_table_name :='DETECTION_INFO_WARNING';
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''3'',''3.为'||v_table_name||'表创建表空间和表分区 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--为detection_info表创建表空间和表分区
|
||
pro_add_part_one_day(v_table_name,'3_');
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''4'',''4.为'||v_table_name||'表创建表空间和表分区 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
-----------------------------------------------------------
|
||
v_table_name :='DI_SYSTEMINFO_DISK';
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''5'',''5.为'||v_table_name||'表创建表空间和表分区 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--为detection_info表创建表空间和表分区
|
||
pro_add_part_one_day(v_table_name,'5_');
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''6'',''6.为'||v_table_name||'表创建表空间和表分区 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
-----------------------------------------------------------
|
||
v_table_name :='DI_SYSTEMINFO_NET';
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''7'',''7.为'||v_table_name||'表创建表空间和表分区 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--为detection_info表创建表空间和表分区
|
||
pro_add_part_one_day(v_table_name,'7_');
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''8'',''8.为'||v_table_name||'表创建表空间和表分区 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
-----------------------------------------------------------
|
||
--为动态表创建表空间及分区
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''9'',''9.为动态表创建表空间及分区 begin'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
|
||
--为动态表创建表空间及分区
|
||
pro_extendtabspace('9_');
|
||
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''10'',''10.为动态表创建表空间及分区 end'')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
EXCEPTION
|
||
--异常处理机制,记录相关的ora错误号以及相关异常信息
|
||
WHEN OTHERS THEN
|
||
BEGIN
|
||
ROLLBACK;
|
||
v_log_table_sql := 'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''-1'',''error:'||SQLERRM||''')';
|
||
EXECUTE IMMEDIATE v_log_table_sql;
|
||
COMMIT;
|
||
--ROLLBACK;
|
||
END;
|
||
END;
|
||
/
|
||
|
||
prompt
|
||
prompt Creating procedure PRO_DRIVER_DEL_PARTITION
|
||
prompt ===========================================
|
||
prompt
|
||
create or replace procedure pro_driver_del_Partition
|
||
Authid Current_User----使存储过程可以使用role权限
|
||
is
|
||
------------- ----------------------------------------
|
||
--可配置
|
||
c_log_table_name CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
|
||
-- c_user_name CONSTANT VARCHAR2(100) :='NMS'; --用户名
|
||
c_cur_pro_name CONSTANT VARCHAR2(100) :='pro_driver_del_Partition'; --当前存储过程的名称
|
||
c_day CONSTANT NUMBER :=2;----指定删除多少天前那天的分区和表空间
|
||
c_count CONSTANT NUMBER :=3;----尝试停用或恢复外键的最大次数(当插入数据时,停用或启用外键会报异常)
|
||
c_sleep_count CONSTANT NUMBER :=5;----两次尝试停用或启用外键的间隔时间,单位:秒
|
||
|
||
---
|
||
v_del_date VARCHAR2(200);----需要删除分区的日期
|
||
--v_log_table_sql VARCHAR2(2000);----记录日志sql语句
|
||
v_cur_sql VARCHAR2(2000);----游标sql
|
||
space_sql VARCHAR2(2000);----sql语句变量
|
||
v_table_name VARCHAR2(2000); --表名
|
||
v_count NUMBER :=0; --记录已尝试停用或恢复外键的次数(当插入数据时,停用或启用外键会报异常)
|
||
v_log_id NUMBER;--日志记录id
|
||
-----------------------------------------------------
|
||
begin
|
||
------------------------------------------------------
|
||
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,'1','1.获取需要删除分区的日期 begin');
|
||
|
||
----获取需要删除分区的日期--暂时未用到
|
||
select to_char(sysdate-c_day,'yyyymmdd') into v_del_date from dual;
|
||
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,'2','2.获取需要删除分区的日期:'||v_del_date||' end');
|
||
|
||
------------------------------------------------------
|
||
--删除指定的表空间
|
||
------------------------------------------------------
|
||
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,'3','3.删除动态表的表空间和分区 begin');
|
||
|
||
|
||
--一、删除动态表的表空间和分区
|
||
v_cur_sql :='select * from user_tab_partitions utp where utp.table_name <> ''DETECTION_INFO'' and to_date(substr(utp.partition_name,-8),''yyyy-MM-dd'')<=to_date('||v_del_date||',''yyyy-MM-dd'')';
|
||
PRO_DELTABSPACE('3_',v_cur_sql);
|
||
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,'4','4.删除动态表的表空间和分区 end');
|
||
|
||
------------------------------------------------------
|
||
v_table_name :='DETECTION_INFO';
|
||
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,'5','5.删除'||v_table_name||'表包含外键表的分区及表空间 begin');
|
||
|
||
|
||
--三、删除包含外键表的分区及表空间
|
||
v_cur_sql :='select * from user_tab_partitions utp where utp.table_name = ''DETECTION_INFO'' and to_date(substr(utp.partition_name,-8),''yyyy-MM-dd'')<=to_date('||v_del_date||',''yyyy-MM-dd'')';
|
||
PRO_DELTABSPACE('5_',v_cur_sql);
|
||
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,'6','6.删除'||v_table_name||'表包含外键表的分区及表空间 end');
|
||
|
||
------------------------------------------------------
|
||
|
||
EXCEPTION
|
||
--异常处理机制,记录相关的ora错误号以及相关异常信息
|
||
WHEN OTHERS THEN
|
||
BEGIN
|
||
ROLLBACK;
|
||
|
||
select SEQ_PRO_EXEC_LOG.nextval into v_log_id from dual;
|
||
PRO_RECORD_LOG_INFO(c_log_table_name,v_log_id,c_cur_pro_name,'-1','error:'||SQLERRM);
|
||
|
||
END;
|
||
end pro_driver_del_Partition;
|
||
/
|
||
|
||
|
||
-- Create sequence
|
||
create sequence SEQ_PRO_EXEC_LOG
|
||
minvalue 1
|
||
maxvalue 999999999999
|
||
start with 1
|
||
increment by 1
|
||
cache 20
|
||
cycle
|
||
order;
|
||
/
|
||
spool off
|