代码表更新

/*
代码表更新
用途:更新以"DM_HF_"开头的代码表(可选全部更新或指定表更新)
编制日期:2009-03-12
测试用例:
传入参数P_OPTION:
1、若要全部更新,传入值可为:'ALL', 'all', 'All',例如:EXEC SP_UPDATE_DM_HF(ALL);
2、若只要单表更新,传入该表名,例如:EXEC SP_UPDATE_DM_HF(DM_HF_DWB);
3、若要多表更新,传入各表名,并以','隔开,
例如:EXEC SP_UPDATE_DM_HF('DM_HF_BJLBB,DM_HF_BJLXB,DM_HF_BJXLB');
*/
CREATE OR REPLACE PROCEDURE SP_UPDATE_DM_HF(
P_OPTION IN VARCHAR2 -- 更新表选项,详细说明见上面的测试用例
) AS
V_TNAME_SRC VARCHAR2(200); -- QB库中DEAS_ADMIN用户下的表码表表名
V_TNAME_DEST VARCHAR2(200); -- DMZHK中对应的表码表表名
V_POSITION NUMBER(3); -- 记录','的位置
V_SQL_TRUNC VARCHAR2(200); -- 清空DEST表中数据的SQL
V_SQL_INSERT VARCHAR2(500); -- 向DEST表插入SRC表数据的SQL
V_OPTION VARCHAR2(50); -- 存储传入的参数值

BEGIN
IF P_OPTION IN ('ALL', 'all', 'All') THEN
-- 全部更新
FOR V_CUR IN (SELECT TABLE_NAME
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'DM_HF_%') LOOP -- 使用游标V_CUR获取所有以'DM_HF_'开头的表名
V_TNAME_SRC := 'A_' || SUBSTR(V_CUR.TABLE_NAME, 4) ||'@DBL_AH';
V_TNAME_DEST := V_CUR.TABLE_NAME;
V_SQL_TRUNC := 'TRUNCATE TABLE ' || V_TNAME_DEST;
V_SQL_INSERT := 'INSERT INTO ' || V_TNAME_DEST || ' SELECT * FROM ' ||
V_TNAME_SRC;
EXECUTE IMMEDIATE V_SQL_TRUNC;
EXECUTE IMMEDIATE V_SQL_INSERT;
END LOOP;
COMMIT;

ELSE
-- 更新指定表
V_OPTION := P_OPTION;
WHILE LENGTH(V_OPTION) > 0 LOOP -- 存储表名的变量还有值
V_POSITION := CASE INSTR(V_OPTION, ',')
WHEN '0' THEN LENGTH(V_OPTION) + 1 -- 无',',即只剩最后一张表,取变量长度为截取终止位
ELSE INSTR(V_OPTION, ',') -- 有',',即还有多张表,取','的位置为截取终止位
END;
-- 表名在ZHKDM中是以'DM'开头,而在DEAS_ADMIN中是以'A'开头,故需截取并替换
V_TNAME_SRC := 'A_' || SUBSTR(V_OPTION, 4, V_POSITION - 4) ||
'@DBL_AH';
V_TNAME_DEST := SUBSTR(V_OPTION, 1, V_POSITION - 1);
V_OPTION := SUBSTR(V_OPTION, V_POSITION + 1); -- 获取完一张表后,截取变量
V_SQL_TRUNC := 'TRUNCATE TABLE ' || V_TNAME_DEST;
V_SQL_INSERT := 'INSERT INTO ' || V_TNAME_DEST || ' SELECT * FROM ' ||
V_TNAME_SRC;
EXECUTE IMMEDIATE V_SQL_TRUNC;
EXECUTE IMMEDIATE V_SQL_INSERT;
END LOOP;
COMMIT;
END IF;

EXCEPTION
WHEN OTHERS THEN
-- 当出现异常时回滚
ROLLBACK;

END;

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21156810/viewspace-1019045/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21156810/viewspace-1019045/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值