/**********************************************************************
通用备份表脚本
共二个输入参数:参数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.设计模式
通用备份表脚本
共二个输入参数:参数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.设计模式