create or replace procedure proc1 as curosr c is select * from 临时表; begin for rc in c loop if rc.标识 = '更新' then insert into 正式表 values select * from 临时表 where 正式表.主鍵=rc.主鍵; elsif rc.标识 = '删除' then delete from 正式表 where 正式表.主鍵=rc.主鍵; elsif rc.标识 = '新增' then insert into 正式表 values select * from 临时表 where 正式表.主鍵=rc.主鍵; end; end loop; end;
insert into 正式表 select a,b,c,d,... from 临时表 where 标识='更新' delete from 正式表 where 主键(或者能唯一标示记录的字段) in (select 主键(同前面的描述) from 临时表 where 标识='删除') 第三同第一条语句,只是标识要改成“新增” 不过如果要多次执行这些语句,这里就要做防重复处理。
这种增删改操作的时候,一次数据量大的话,可以用分散提交。 DECLARE v_commit_cnt pls_integer:=500; v_recod_cnt pls_integer:=0; CURSOR c IS SELECT * FROM 临时表; a_dt c%rowtype; BEGIN OPEN the_cursor ; LOOP FETCH c INTO a_dt; EXIT WHEN c%NOTFOUND; if rc.标识 = '更新' then insert into 正式表 values select * from 临时表 where 正式表.主鍵=rc.主鍵; elsif rc.标识 = '删除' then delete from 正式表 where 正式表.主鍵=rc.主鍵; elsif rc.标识 = '新增' then INSERT INTO 正式表 VALUES SELECT * FROM 临时表 WHERE 正式表.主鍵=rc.主鍵; END if; IF v_recod_cnt=v_commit_cnt THEN COMMIT; ELSE v_recod_cnt:=v_recod_cnt+1; END IF; END loop; CLOSE c; END; /
这个可以,批量DML操作时候,注意commit!不然造成回滚段空间不足!
create or replace procedure p1 as begin for i in(select 主键,标识 from 临时表) loop if i.标识='更新' then insert 正式表 select * from 临时表 where 主键=i.主键 and 标识=i.标识; elsif i.标识='删除' then delete from 正式表 where 主键=i.主键; elsif i.标识='新增' then insert 正式表 select * from 临时表 where 主键=i.主键 and 标识=i.标识; end if; commit; end loop; end;
curosr c is select * from 临时表;
begin
for rc in c loop
if rc.标识 = '更新' then
insert into 正式表 values select * from 临时表 where 正式表.主鍵=rc.主鍵;
elsif rc.标识 = '删除' then
delete from 正式表 where 正式表.主鍵=rc.主鍵;
elsif rc.标识 = '新增' then
insert into 正式表 values select * from 临时表 where 正式表.主鍵=rc.主鍵;
end;
end loop;
end;
delete from 正式表 where 主键(或者能唯一标示记录的字段) in (select 主键(同前面的描述) from 临时表 where 标识='删除')
第三同第一条语句,只是标识要改成“新增”
不过如果要多次执行这些语句,这里就要做防重复处理。
DECLARE
v_commit_cnt pls_integer:=500;
v_recod_cnt pls_integer:=0;
CURSOR c IS SELECT * FROM 临时表;
a_dt c%rowtype;
BEGIN
OPEN the_cursor ;
LOOP
FETCH c INTO a_dt;
EXIT WHEN c%NOTFOUND;
if rc.标识 = '更新' then
insert into 正式表 values select * from 临时表 where 正式表.主鍵=rc.主鍵;
elsif rc.标识 = '删除' then
delete from 正式表 where 正式表.主鍵=rc.主鍵;
elsif rc.标识 = '新增' then
INSERT INTO 正式表 VALUES SELECT * FROM 临时表 WHERE 正式表.主鍵=rc.主鍵;
END if;
IF v_recod_cnt=v_commit_cnt THEN
COMMIT;
ELSE
v_recod_cnt:=v_recod_cnt+1;
END IF;
END loop;
CLOSE c;
END;
/
这个可以,批量DML操作时候,注意commit!不然造成回滚段空间不足!
as
begin
for i in(select 主键,标识 from 临时表) loop
if i.标识='更新' then
insert 正式表 select * from 临时表 where 主键=i.主键 and 标识=i.标识;
elsif i.标识='删除' then
delete from 正式表 where 主键=i.主键;
elsif i.标识='新增' then
insert 正式表 select * from 临时表 where 主键=i.主键 and 标识=i.标识;
end if;
commit;
end loop;
end;