構建測試用例的思路是:loop迴圈進行資料處理的時候是先得到結果集再進行主體邏輯處理還是一邊迴圈得到結果,一邊處理主體邏輯!
建立測試用表:
create table t(id number,month varchar2(20));
create table t1(id number,log_date date default sysdate,log_context varchar2(3000),who varchar2(30) default user);
create table error_trigger(error_no varchar2(6),error_message varchar2(200),trigger_name varchar2(50),trgger_user varchar2(30),trigger_date date,error_comment varchar2(300));
create table t2(id number,monthly date);
為t1表增加序列,觸發器:
create sequence seq_jz
increment by 1
start with 1
maxvalue 999999
minvalue 1
nocycle
nocache;
/create or replace trigger t1_insert
before insert on scott.t1
for each row
declare
v_id number;
v_sqlcode varchar2(6);
v_sqlerrm varchar2(200);
v_error_comment varchar2(300);
v_trigger_user varchar2(30);
v_trigger_date date;
begin
v_error_comment :='before get user';
v_trigger_user :=user;
v_id :=seq_jz.nextval;
:new.id:=v_id;
:new.log_date :=sysdate ;
:new.who :=user;
v_error_comment :='after get user';
v_trigger_date :=sysdate;
exception
when others then
v_sqlcode :=sqlcode;
v_sqlerrm :=substr(sqlerrm,1,200);
insert into error_trigger(error_no,error_message,trigger_name,trgger_user,trigger_date,error_comment)
values(v_sqlcode,v_sqlerrm,'t1_insert',v_trigger_user,v_trigger_date,v_error_comment);
commit;
end;
/
為t表新增測試資料(新增2,3月份資料,注意這裡2月份是沒有29號以後的日期的):
declare
v_num varchar2(30);
begin
for i in 1..31 loop
v_num :=i;
if v_num<=9 then
v_num :='0'||v_num;
end if;
insert into t values(v_num,'2016-03-'||v_num) ;
end loop;
commit;
end;
/
執行儲存過程:
create or replace procedure test_loop is
v_count number :=0;
v_num number :=0;
begin
for x in (select id,to_date(month,'yyyy-mm-dd') month from t)
loop
begin
insert into t2 values(x.id,x.month);
v_count :=v_count+1;
v_num :=v_num+1;
if v_count>29 then
commit;
v_count:=0;
end if;
exception
when others then
error_insert('內部第'||v_num||'條資料插入錯誤 '||sqlerrm);
end ;
end loop;
commit;
exception
when others then
error_insert('外部第'||v_num||'條資料插入錯誤 '||sqlerrm);
end;
/
報錯儲存過程:
create or replace procedure error_insert(p_log_context varchar2) is
pragma autonomous_transaction;
begin
insert into t1(log_context) values(p_log_context);
commit;
end;
/
結果集用截圖說明: 在處理到29條資料時,由於無效日期原因,捕獲異常後,過程停止,即使之後還有正常資料,異常處理後並沒有繼續處理正常的資料!
筆者在**圈定處理資料的時候加入了排序:
for x in (select id,to_date(month,'yyyy-mm-dd') month from t order by 1)
這個圈定資料根本不會出來結果集,因為會報錯,但是之前不加排序,是可以顯示2016-02-30之前的資料的,快取到這一條才會報錯,之前的資料都可以處理,這就跟oracle的返回機制有關係了,這個還請大神給予解讀!
Oracle FOR迴圈語句練習
列印輸出從1到10的正整數 declare v i number 10 0 begin loop v i v i 1 dbms output.put line v i exit when v i 10 或者v i 9 end loop end 列印輸出從1到10之間的偶數 declare v i n...
Oracle PL SQL之LOOP迴圈控制語句
在pl sql中可以使用loop語句對資料進行迴圈處理,利用該語句可以迴圈執行指定的語句序列。常用的loop迴圈語句包含3種形式 基本的loop while.loop和for.loop。loop語句的基本語法結構如下 loop statement.end loop label name 語法說明 l...
less中的loop迴圈
在專案中管理css一般都會使用預編譯語言,其中less算是比較好用的一種。但是官方給的介紹中關於迴圈生成變數名的方法比較簡單,沒有針對一串陣列值來編譯變數名的方法。總結很多文件之後,總結了下面方法用於快速生成css的方法,雖然直接用手寫的方式也能使用,但是感覺那樣很low。下面是使用函式生成marg...