oracle plsql採用for loop和rollback savepoint實現重複值可繼續插入exception

wisdomone1發表於2013-05-27

--建立表並構建唯一索引
SQL> create table t_unique(a int);
 
Table created
 
SQL> create unique index idx_t_unique on t_unique(a);
 
Index created
 
SQL> insert into t_unique values(1);
 
1 row inserted
 
SQL> commit;
 
Commit complete

--如果再相同值則報錯
SQL> insert into t_unique values(1);
 
insert into t_unique values(1)
 
ORA-00001: unique constraint (TBL_BCK.IDX_T_UNIQUE) violated


--讓重複插入可以有5次機會,最終可以插入資料
create or replace procedure proc_same_continue_insert
as
v_a pls_integer:=1;
begin
for i in 1..5 loop
    dbms_output.put(i||' insert ');--標記為第幾次插入
      begin
        savepoint transaction_savepoint1;--真正插入前標記一個儲存點,便於回滾
        insert into t_unique values(v_a);
        commit;
        dbms_output.put_line(i||' insert succeed');--僅起到一個輸出日誌的功能
        exit;--插入完記錄後直接退出儲存過程的執行
      exception
        when dup_val_on_index then --如果重複插入
           dbms_output.put_line('insert same key,please retry');--先提示重複插入
           v_a:=v_a+1;--累加重複插入的值為一個新值
           rollback to transaction_savepoint1;--注:此行語句與上行程式碼v_a:=v_a+1順序先後皆不影響程式碼實現
      end;
end loop;
end;
/
 
Procedure created
 
SQL> select * from t_unique;
 
                                      A
---------------------------------------
                                      1
 
SQL> exec proc_same_continue_insert;
 
1 insert insert same key,please retry
2 insert 2 insert succeed
 
PL/SQL procedure successfully completed
 
SQL> select * from t_unique;
 
                                      A
---------------------------------------
                                      1
                                      2 --插入一個新記錄
                                     
小結:1,適用於高併發的環境,可能會發生多客戶端同時插入記錄,會出現插入相同值的情況,可採用此法
      2,實現機制:採用exception異常處理模組,累加出錯列值為另一新值,再用rollback savepoint繼續執行原
        insert程式碼實現
      3,成功insert後,commit提交,爾後是exit;直接退出即可儲存過程即可                                     

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-762142/,如需轉載,請註明出處,否則將追究法律責任。

相關文章