oracle merge及其他方式实现存在更新不存在插入操作

来源:互联网 发布:软件测试考试题库 编辑:程序博客网 时间:2024/05/21 09:55
create or replace procedure testUpdate is
 sqlexecutedate date;         --sql开始执行时间
 errorcode varchar(255);     --sql异常码
 executemessage varchar(255);  --sql执行信息
 executenum number(20) default 0; --sql执行条数
    commitnum number(20) default 0; --sql执行条数
    isexists number;
begin

   sqlexecutedate:=sysdate;
declare Cursor  policys 
   is
    select
      sno sno,
      name name,
      sex sex,
      flag flag
     from astudent1
     --where updatetime like trunc(sysdate)
    ;
    policy policys%rowtype--游标变量policy
    ;
    --executenum := sql%rowcount
    --;
    begin
    for policy in policys 
       loop
         executenum:=executenum+1;
         --update astudent2 set name=policy.name,sex=policy.sex,updatetime=sysdate where sno=policy.sno
         select count(1) into isexists from astudent2 where sno=policy.sno;
         --dbms_output.put_line('isesixt:'||isexists);
         if isexists>0 then  
              dbms_output.put_line(executenum||':update');
              update astudent2 set name=policy.name,sex=policy.sex,updatetime=sysdate where sno=policy.sno and exists (select sno from astudent2 where sno=policy.sno);
         else 
             dbms_output.put_line(executenum||':insert');
             insert into astudent2(sno,name,sex,flag,inserttime,updatetime)values(policy.sno,policy.name,policy.sex,policy.flag,sysdate,sysdate);
         end if;
         
        /* merge into astudent2 s2   
         using (select sno sno, name name,sex sex,flag flag from astudent1) s1   
         on (s2.sno = s1.sno)   
         when matched then  
            update set s2.name=s1.name, s2.sex=s1.sex,s2.flag='update', s2.updatetime=sysdate 
         when not matched then  
            insert values(s1.sno,s1.name,s1.sex,'insert',sysdate,sysdate); */
         
         if mod(executenum,5)=0 then 
            commitnum:=commitnum+1;
            dbms_output.put_line('第'||commitnum||'次提交数据');
             commit;
         end if
         ;
       end loop;
       dbms_output.put_line('共更新'||executenum||'条数据');
       commit;
    end;
        dbms_output.put_line('耗时:'||(sysdate-sqlexecutedate)*24*60*60*1000||'ms');
      dbms_output.put_line('startdate:'||to_char(sqlexecutedate,'YYYY-MM-DD HH24:MI:SS ssss'));
      dbms_output.put_line('startdate:'||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS ssss'));
   

exception
when others then

    executemessage:=substr(sqlerrm,1,251);
    errorcode:=sqlcode;
       dbms_output.put_line('异常:'||executemessage);
       dbms_output.put_line('异常code:'||errorcode);
    
rollback;


end ;
0 0