oracle 备份数据

/**********************************************************************
通用备份表脚本

共二个输入参数:参数2-1、参数2-2

把需要备份的数据源表结构解析出来,组合并创建结构相同的新表,最后把数据
源表的全部数据插入到建的目的表中.

注:对表结构的解析,只进行了三种数据类型的重构,即DATE/NUMBER/VARCHAR2
要作到真正通用,数据类型还再扩充完整。
**********************************************************************/

DECLARE
CURSOR tbl_struct_cur IS
SELECT *
FROM ALL_TAB_COLS
WHERE TABLE_NAME = UPPER('aaaa') --参数2-1:输入要备份的数据源表名
ORDER BY COLUMN_ID;

from_tbl varchar2(30) := 'aaaa'; --参数2-2:输入要备份的数据源表名
to_tbl VARCHAR2(30) := from_tbl||'_SWITCH_BK'; --备份目的表名 = 数据源表名||'_SWITCH_BK'
v_col VARCHAR2(2000) := ' ';

BEGIN
BEGIN
--重构列结构
FOR rec IN tbl_struct_cur
LOOP
IF rec.Data_type = 'DATE' THEN
v_col := (CASE v_col WHEN ' ' THEN ' ' ELSE v_col || ', ' END) || rec.COLUMN_NAME || ' DATE';
ELSIF rec.Data_type = 'NUMBER' THEN
v_col := (CASE v_col WHEN ' ' THEN ' ' ELSE v_col || ', ' END) || rec.COLUMN_NAME ||
(CASE nvl(rec.DATA_PRECISION, 0) WHEN 0 THEN ' NUMBER' ELSE ' NUMBER('||to_char(rec.DATA_PRECISION)||','||to_char(rec.DATA_SCALE) || ')' END);
ELSIF rec.Data_type = 'VARCHAR2' THEN
v_col := (CASE v_col WHEN ' ' THEN ' ' ELSE v_col || ', ' END) || rec.COLUMN_NAME || ' VARCHAR2('||to_char(rec.DATA_LENGTH) || ')';
END IF;
END LOOP;

--组合语句
v_col := 'CREATE TABLE ' || to_tbl || '(' || v_col || ')';

--建表
BEGIN
EXECUTE IMMEDIATE v_col;
EXCEPTION
WHEN OTHERS THEN
BEGIN
raise_application_error(-20000,'创建表时发生错误:'||chr(13)||SQLERRM);
END;
END;

--导出数据
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO '|| to_tbl || ' SELECT * FROM '|| from_tbl;
EXCEPTION
WHEN OTHERS THEN
BEGIN
ROLLBACK;
raise_application_error(-20000,'导入数据时发生错误:'||chr(13)||SQLERRM);
END;
END;

COMMIT;
EXCEPTION
WHEN OTHERS THEN
BEGIN
ROLLBACK;
raise_application_error(-20000,'发生错误:'||chr(13)||SQLERRM);
END;
END;
END;
Head.First.设计模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值