oracle大表复制 存储过程(转)

create or replace procedure P_HPS_TABLEBAK(P_TableOri in VARCHAR2,
P_TableBack in VARCHAR2,
P_TemplateId in VARCHAR2,
P_Message out INTEGER) as

V_I number(10);
V_J number(10);
V_ERRCODE varchar2(100);
V_ERRMSG varchar2(100);
V_COMMITNUM number := 10000;
V_COLUMNNAMES varchar2(1000) := '';
V_COLUMNNAME T_HPS_TEMPLATE.COLUMN_NAME%type;
n_insertAll number := 0;
v_sql varchar(500) := 'select * from ' || P_TableOri;
v_tempsql varchar(500) := 'select COLUMN_NAME from T_HPS_TEMPLATE where TEMPLATE_ID = ''' ||
P_TemplateId || '''';
O_CALLDATA PACK_HPS.HPS_CURSOR; --临时游标
begin
--开始执行复制,锁定表
EXECUTE IMMEDIATE 'UPDATE T_HPS_TEMPLATE_OUTBOUND SET IS_LOCKED=3 WHERE OUTBOUND_NAME = ''' ||
P_TableOri || '''';
COMMIT;
EXECUTE IMMEDIATE 'select count(*) from ' || P_TableOri
into n_insertAll;
OPEN O_CALLDATA FOR v_tempsql;
LOOP
FETCH O_CALLDATA
INTO V_COLUMNNAME;
EXIT WHEN O_CALLDATA%NOTFOUND;
V_COLUMNNAMES := V_COLUMNNAMES || ',' || V_COLUMNNAME;
END LOOP;
close O_CALLDATA;
V_COLUMNNAMES := SUBSTR(V_COLUMNNAMES, 2);
if n_insertAll > 0 then
EXECUTE IMMEDIATE 'create table ' || P_TableBack ||
' as select * from ' || P_TableOri ||
' where 1!=1 ';
V_I := MOD(n_insertAll, V_COMMITNUM);
V_J := n_insertAll / V_COMMITNUM;
if V_I = 0 then
V_I := V_J;
else
V_I := V_J + 1;
end if;
for i in 1 .. V_I loop
v_sql := 'insert into ' || P_TableBack || ' select ' || V_COLUMNNAMES ||
' from (select row_.*, rownum rownum_ from (select *' ||
' from ' || P_TableOri || ') row_ where rownum <= ' ||
V_COMMITNUM * i || ' ) where rownum_ >=' ||
(V_COMMITNUM * (i - 1) + 1);
EXECUTE IMMEDIATE v_sql;
COMMIT;
end loop;
EXECUTE IMMEDIATE 'select count(*) from ' || P_TableBack
into P_Message;
else
P_Message := 0;
end if;
--任务执行完成,解除表锁定
EXECUTE IMMEDIATE 'UPDATE T_HPS_TEMPLATE_OUTBOUND SET IS_LOCKED=0 WHERE OUTBOUND_NAME = ''' ||
P_TableOri || '''';
COMMIT;

EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
--执行失败,解除表锁定
EXECUTE IMMEDIATE 'UPDATE T_HPS_TEMPLATE_OUTBOUND SET IS_LOCKED=0 WHERE OUTBOUND_NAME = ''' ||
P_TableOri || '''';
COMMIT;
V_ERRCODE := SQLCODE;
V_ERRMSG := SQLERRM;
INSERT INTO T_HPS_DEBUGMSG
(LOGTIME, OBJNAME, MESSAGE)
VALUES
(SYSDATE, 'P_HPS_TABLEBAK', V_ERRCODE || ':' || V_ERRMSG);
OPEN O_CALLDATA FOR
SELECT 1 FROM DUAL WHERE 1 = 2;
COMMIT;
RETURN;
end P_HPS_TABLEBAK;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值