官术网_书友最值得收藏!

2.6.2 循環語句

DM SQL程序支持4種基本類型的循環語句,即LOOP語句、WHILE語句、FOR語句和REPEAT語句。LOOP語句循環執行一系列語句,直到EXIT語句終止循環為止;WHILE語句循環檢測一個條件表達式,當表達式的值為TRUE時就執行循環體的語句;FOR語句對一系列語句重復執行指定次數;REPEAT語句重復執行一系列語句直至達到條件表達式的限制要求。

1.LOOP語句

LOOP語句實現對一系列語句的重復執行,是循環語句的最簡單形式。它沒有明顯的終點,必須借助EXIT語句來跳出循環。LOOP語句的語法格式如下:

img

【例2-29】LOOP語句用法舉例。

img

第5~11行是一個LOOP循環,每次循環都打印參數a的值,并將a的值減1,直到a小于等于0為止。

2.WHILE語句

WHILE語句在每次循環開始以前,先計算條件表達式,若該條件表達式的值為TRUE,則語句序列被執行一次,然后控制重新回到循環頂部;若條件表達式的值為FALSE,則結束循環。當然,也可以通過EXIT語句來終止循環。WHILE語句的語法格式如下:

img

【例2-30】WHILE語句用法舉例。

img

這個例子的功能與例2-29相同,只是使用了WHILE語句。

3.FOR語句

當FOR語句執行時,首先檢查下限表達式的值是否小于上限表達式的值,如果下限數值大于上限數值,則不執行循環體。否則,將下限數值賦予循環計數器(如果語句中使用了REVERSE關鍵字,則把上限數值賦給循環計數器);然后執行循環體內的語句序列;執行完后,循環計數器值加1(如果有REVERSE關鍵字,則減1);檢查循環計數器的值,若仍在循環范圍內,則重新繼續執行循環體;如此循環,直到循環計數器的值超出循環范圍。同樣,也可以通過EXIT語句來終止循環。FOR語句的語法格式如下:

img

循環計數器是一個標識符,它類似于一個變量,但是不能被賦值,且作用域僅限于FOR語句內部。下限表達式和上限表達式用來確定循環的范圍,它們的類型必須和整型兼容。循環范圍是在循環開始之前確定的,即使在循環過程中下限表達式或上限表達式的值發生了改變,也不會引起循環范圍的變化。

【例2-31】FOR語句用法舉例。

img
img

這個例子的功能也與例2-29相同,只是使用了FOR語句。

FOR語句中的循環計數器可與當前程序塊內的參數或變量同名,這時該同名的參數或變量在FOR語句的范圍內被屏蔽。

【例2-32】FOR語句中的循環計數器與當前程序塊內的參數或變量同名舉例。

img

此例中,循環計數器v1與DATE類型的變量v1同名。在FOR語句內,PRINT語句將v1當作循環計數器。而FOR語句外的PRINT語句則將v1當作DATE類型的變量。

4.REPEAT語句

REPEAT語句用于重復執行一條或多條語句。REPEAT語句的語法格式如下:

img

【例2-33】REPEAT語句用法舉例。

img

5.EXIT語句

EXIT語句與循環語句一起使用,用于終止其所在循環語句的執行,將控制轉移到該循環語句外的下一個語句繼續執行。注意:EXIT語句必須出現在一個循環語句中,否則將報錯。EXIT語句的語法格式如下:

img

當EXIT后面的標號名省略時,該語句將直接終止包含它的那條循環語句;當EXIT后面帶有標號名時,該語句用于終止標號名所標識的那條循環語句。需要注意的是,該標號名所標識的語句必須是循環語句,并且EXIT語句必須出現在此循環語句中。當EXIT語句位于多重循環中時,可以用該功能來終止其中的任何一重循環。

當WHEN子句省略時,EXIT語句無條件地終止該循環語句;否則,先計算WHEN子句中的條件表達式,當條件表達式的值為TRUE時,終止該循環語句。

【例2-34】不帶標號名的EXIT語句舉例。

img

運行結果為:

img

【例2-35】帶標號名的EXIT語句舉例。

img
img

運行結果為:

img

6.CONTINUE語句

CONTINUE語句的作用是退出本次循環,并且將語句控制轉移到下一次循環或者指定標簽的循環的開始位置,繼續執行。CONTINUE語句的語法格式如下:

img

若CONTINUE后沒有跟WHEN子句,則無條件立即退出本次循環,并且將語句控制轉移到下一次循環或者指定標簽的循環的開始位置,繼續執行。

【例2-36】CONTINUE語句舉例。

img

運行結果為:

img
img

CONTINUE WHEN語句的作用是當WHEN后面的條件滿足時,將語句控制轉移到下一次循環或者指定標簽的循環的開始位置并繼續執行。每次循環到達CONTINUE WHEN時,都會對WHEN的條件表達式進行計算,如果值為FALSE,則CONTINUE WHEN對應的語句不會被執行。為了防止出現死循環,可以將WHEN的條件設置為一個值肯定為TRUE的表達式。

【例2-37】CONTINUE WHEN語句舉例。

img

運行結果為:

img

7.FORALL語句

FORALL語句的作用是將數據從一個集合傳送給指定的使用集合的表,即當需要對數據表進行批量INSERT、UPDATE和DELETE 操作時,可以使用FORALL語句,這樣不僅可以簡化代碼,并且可以優化數據操作的性能。需要注意的是,優化處理會影響游標的屬性值,導致其不可使用。可以通過dm.ini配置文件中的USE_FORALL_ATTR參數控制是否進行優化處理,值為0表示可以優化,不使用游標屬性;值為1表示不優化,使用游標屬性,默認值為0。其語法格式如下:

img
img

其中,SAVE EXCEPTIONS設定,即使一些DML語句失敗,也直到FORALL語句執行結束才拋出異常;INDICES OF <集合>表示跳過集合中沒有賦值的元素,可用于指向稀疏數組的實際下標;VALUES OF <集合>把該集合中的值作為下標。

(1)用法1。

img

說明:①循環計算器是被遍歷的數組元素的下標。②下標必須是連續的,否則執行會報錯。③執行的SQL語句只能有一個。

【例2-38】創建表t_student,并批量插入數據。

步驟1:創建表t_student。

img

步驟2:批量插入數據。

img

(2)用法2。

在用法1中,如果數組中的數據下標不連續,則執行FORALL語句時會發生錯誤,如下面的代碼:

img
img

為了解決上述問題,需要使用INDICES OF和VALUES OF兩個子句,INDICES OF子句語法格式如下。

img

說明:①循環計算器是被遍歷的數組元素的下標。②INDICES OF可以是循環跳過的沒有賦值的元素,被賦予NULL也算有值。③BETWEEN 下限 AND 上限子句是可選的,作用是把子句的“下限”到“上限”范圍之內的數值與數組元素下標做個交集,并遍歷。這個交集可能是數組的全部元素,也可能是部分元素,或者為空。如果不指定,就遍歷數組全部元素。④執行的SQL語句只能是一條。

【例2-39】INDICES OF用法舉例。注意運行下面代碼之前,先刪除表t_student中的數據。

img

(3)用法3。

VALUES OF子句語法格式如下。

img

說明:①循環計算器是被遍歷元素的值,且該集合值的類型只能是PLS_INTEGER或者BINARY_INTEGER;②執行的SQL語句只能是一條。

【例2-40】VALUES OF用法舉例。

img
主站蜘蛛池模板: 读书| 澳门| 阳信县| 化州市| 沭阳县| 宁南县| 望都县| 余干县| 龙川县| 梁河县| 旬邑县| 乐亭县| 芜湖县| 启东市| 视频| 陇南市| 湟中县| 弥渡县| 明光市| 海淀区| 太白县| 贵定县| 澄江县| 利川市| 屏南县| 白山市| 和政县| 大连市| 玉树县| 新巴尔虎右旗| 徐汇区| 城步| 龙州县| 苏州市| 花垣县| 藁城市| 拜泉县| 郯城县| 兴文县| 赤城县| 富裕县|