1. 程式人生 > 其它 >Oracle的for迴圈執行順序詳解

Oracle的for迴圈執行順序詳解

技術標籤:oracle

oracle 測試for 迴圈:
1.經常會有要寫for 迴圈的場景:
for 迴圈名 in (迴圈體) loop end loop;

2.問題背景:
for 迴圈體內的執行順序,究竟是查詢了結果集,再去跑迴圈,還是每一次都會重新獲取結果集;

3.問題:
我對迴圈體內的表進行增刪改,會不會影響到我的迴圈結果;

4.測試:
1)建表+插入資料:

create table TMP_TEST_ZLR 
(
orderlineno  varchar2(100),
descr        varchar2(100)

)

insert into TMP_TEST_ZLR(orderlineno,descr) values('1','第一行資料');
insert into TMP_TEST_ZLR(orderlineno,descr) values('2','第二行資料');
insert into TMP_TEST_ZLR(orderlineno,descr) values('3','第三行資料');
insert into TMP_TEST_ZLR(orderlineno,descr) values('4','第四行資料');
insert into TMP_TEST_ZLR(orderlineno,descr) values('5','第五行資料');
insert into TMP_TEST_ZLR(orderlineno,descr) values('6','第六行資料');
insert into TMP_TEST_ZLR(orderlineno,descr) values('7','第七行資料');
insert into TMP_TEST_ZLR(orderlineno,descr) values('8','第八行資料');

表的資料結果:
在這裡插入圖片描述

2)寫迴圈:

  declare r_int int;
  begin
    r_int := 1;
          for r in (select * from TMP_TEST_ZLR a order by a.orderlineno) loop
            if r_int = r.orderlineno then
              dbms_output.put_line(r.descr);
            end if;
            delete from TMP_TEST_ZLR a where a.orderlineno = '2';
            commit;
            r_int := r_int+1;
          end loop;
  end ;

解釋:
–1.我在跑迴圈的過程中,刪了這個某一行測試表的資料,想要看看是否會干擾for 迴圈的執行
1)如果是以先查出結果集來跑迴圈的,那應該會打印出我的第二行資料;
2)如果不是,那就只會有7行資料;

3)最終結果:
列印:在這裡插入圖片描述
資料表結果:
在這裡插入圖片描述

5.結論
1.for 迴圈體內的執行順序:先全查,得到了結果集,再去跑迴圈,迴圈體內的表進行增刪改,迴圈體的結果集資料不變;