利用ORACLE存储过程与JOB结合实现对数据表自动备份(用循环实现)
2009-09-23 13:45
465 查看
1、创建存储过程
create or replace procedure data_auto_backup as
v_tablename varchar2(200);
v_year varchar2(10);
v_month varchar2(10);
v_bakdate varchar2(50);
v_maxdate date;
v_tablecount integer;
v_recordcount integer;
TYPE backup_type IS RECORD (
table_name VARCHAR(100),
field_name VARCHAR(100),
field1_name VARCHAR(100)
);
type backup_table_field_array IS TABLE OF backup_type INDEX BY BINARY_INTEGER;
backup_tables backup_table_field_array;
backup_table backup_type;
begin
select max(t.field1) - 40 into v_maxdate from table1 t;
v_year := to_char(v_maxdate,'yyyy');
v_month := to_char(v_maxdate,'MM');
v_bakdate := to_char(v_maxdate,'yyyy-MM-dd');
backup_table.table_name := 'table1';
backup_table.field_name := 'field2';
backup_table.field1_name := 'field1';
backup_tables(1) := backup_table;
backup_table.table_name := 'table2';
backup_table.field_name := 'field3';
backup_table.field1_name := 'field1';
backup_tables(2) := backup_table;
for i IN 1..backup_tables.count LOOP
-- 检查将要使用的年月表是否存在
v_tablename := backup_tables(i).table_name || v_year || v_month;
--dbms_output.put_line('v_tablename ' || v_tablename);
SELECT COUNT(TABLE_NAME) INTO v_tablecount FROM USER_TABLES ut WHERE ut.table_name = v_tablename;
if v_tablecount>0 then
dbms_output.put_line('该表存在!');
else begin
dbms_output.put_line('该表不存在或当前用户无权访问!');
execute immediate 'CREATE TABLE ' || v_tablename || ' AS SELECT * FROM ' || backup_tables(i).table_name || ' sr WHERE sr.' || backup_tables(i).field_name || '=''''';
end;
end If;
-- 表备份
execute immediate 'DELETE FROM ' || v_tablename || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''';
execute immediate 'INSERT INTO ' || v_tablename || ' SELECT * FROM ' || backup_tables(i).table_name || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''';
--dbms_output.put_line('DELETE FROM ' || v_tablename || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''');
--dbms_output.put_line('INSERT INTO ' || v_tablename || ' SELECT * FROM ' || backup_tables(i).table_name || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''');
--dbms_output.put_line('SELECT COUNT(sr.' || backup_tables(i).field_name || ') FROM ' || v_tablename || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''');
execute immediate 'SELECT COUNT(sr.' || backup_tables(i).field_name || ') FROM ' || v_tablename || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''' into v_recordcount;
if v_recordcount>0 then begin
execute immediate 'DELETE FROM ' || backup_tables(i).table_name || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''';
--dbms_output.put_line('DELETE FROM ' || backup_tables(i).table_name || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''');
end;
end If;
commit;
END LOOP;
dbms_output.put_line('Ok' || v_recordcount);
end;
2、创建JOB
--1天运行一次,当前运行第一次
begin
sys.dbms_job.submit(job => :job,
what => 'data_auto_backup;',
next_date => sysdate,
interval => 'sysdate+1');
commit;
end;
/
create or replace procedure data_auto_backup as
v_tablename varchar2(200);
v_year varchar2(10);
v_month varchar2(10);
v_bakdate varchar2(50);
v_maxdate date;
v_tablecount integer;
v_recordcount integer;
TYPE backup_type IS RECORD (
table_name VARCHAR(100),
field_name VARCHAR(100),
field1_name VARCHAR(100)
);
type backup_table_field_array IS TABLE OF backup_type INDEX BY BINARY_INTEGER;
backup_tables backup_table_field_array;
backup_table backup_type;
begin
select max(t.field1) - 40 into v_maxdate from table1 t;
v_year := to_char(v_maxdate,'yyyy');
v_month := to_char(v_maxdate,'MM');
v_bakdate := to_char(v_maxdate,'yyyy-MM-dd');
backup_table.table_name := 'table1';
backup_table.field_name := 'field2';
backup_table.field1_name := 'field1';
backup_tables(1) := backup_table;
backup_table.table_name := 'table2';
backup_table.field_name := 'field3';
backup_table.field1_name := 'field1';
backup_tables(2) := backup_table;
for i IN 1..backup_tables.count LOOP
-- 检查将要使用的年月表是否存在
v_tablename := backup_tables(i).table_name || v_year || v_month;
--dbms_output.put_line('v_tablename ' || v_tablename);
SELECT COUNT(TABLE_NAME) INTO v_tablecount FROM USER_TABLES ut WHERE ut.table_name = v_tablename;
if v_tablecount>0 then
dbms_output.put_line('该表存在!');
else begin
dbms_output.put_line('该表不存在或当前用户无权访问!');
execute immediate 'CREATE TABLE ' || v_tablename || ' AS SELECT * FROM ' || backup_tables(i).table_name || ' sr WHERE sr.' || backup_tables(i).field_name || '=''''';
end;
end If;
-- 表备份
execute immediate 'DELETE FROM ' || v_tablename || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''';
execute immediate 'INSERT INTO ' || v_tablename || ' SELECT * FROM ' || backup_tables(i).table_name || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''';
--dbms_output.put_line('DELETE FROM ' || v_tablename || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''');
--dbms_output.put_line('INSERT INTO ' || v_tablename || ' SELECT * FROM ' || backup_tables(i).table_name || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''');
--dbms_output.put_line('SELECT COUNT(sr.' || backup_tables(i).field_name || ') FROM ' || v_tablename || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''');
execute immediate 'SELECT COUNT(sr.' || backup_tables(i).field_name || ') FROM ' || v_tablename || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''' into v_recordcount;
if v_recordcount>0 then begin
execute immediate 'DELETE FROM ' || backup_tables(i).table_name || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''';
--dbms_output.put_line('DELETE FROM ' || backup_tables(i).table_name || ' sr WHERE TO_CHAR(sr.' || backup_tables(i).field1_name || ',''yyyy-MM-dd'') = ''' || v_bakdate || '''');
end;
end If;
commit;
END LOOP;
dbms_output.put_line('Ok' || v_recordcount);
end;
2、创建JOB
--1天运行一次,当前运行第一次
begin
sys.dbms_job.submit(job => :job,
what => 'data_auto_backup;',
next_date => sysdate,
interval => 'sysdate+1');
commit;
end;
/
相关文章推荐
- 利用ORACLE存储过程与JOB结合实现对数据表自动备份
- 利用批处理及计划任务实现服务器间的数据自动备份
- 利用Shell脚本实现自动备份VPS数据到Dropbox
- 利用ftp命令+bat程序实现本地数据定时备份到服务器
- wpf中利用多重绑定实现表中数据越界自动报警
- Linux下利用七牛云和crontab实现定时自动备份
- 利用反射将数据库中的数据两表自动对接实现数据传输
- 用批处理命令加WinRAR实现自动备份文件数据
- linux下rsync+sersync实现自动备份数据
- MeritMS—利用beego实现数据库自动备份
- 利用数据存储技术实现数据安全合理备份
- 利用反射和自定义特性实现基本数据存取操作自动获取
- 利用SQLyog实现mysql数据库定时自动备份
- SQL Server下利用vbscript 实现数据库月备份自动清理并发邮件提醒
- 完整利用Rsync实现服务器/网站数据增量同步备份
- 使用winrar与FTP结合,实现异地自动备份
- MSSQL · 最佳实践 · 利用文件组实现冷热数据隔离备份方案
- 用批处理命令加WinRAR实现自动备份文件数据
- 利用DBLink+JOB实现两个Oracle数据库之间的数据同步
- 利用SQLyog实现mysql自动备份