PL/SQL簡單循環(huán)
在編寫PL/SQL代碼時,簡單循環(huán)是一種常見的結(jié)構(gòu)。它是所有循環(huán)結(jié)構(gòu)中最基礎(chǔ)的,由LOOP和END LOOP關(guān)鍵字組成。具體語法如下: LOOP --可執(zhí)行的語句 END LOOP;
在編寫PL/SQL代碼時,簡單循環(huán)是一種常見的結(jié)構(gòu)。它是所有循環(huán)結(jié)構(gòu)中最基礎(chǔ)的,由LOOP和END LOOP關(guān)鍵字組成。具體語法如下:
LOOP
--可執(zhí)行的語句
END LOOP;
循環(huán)的結(jié)束條件
簡單循環(huán)的結(jié)束依賴于循環(huán)內(nèi)部的EXIT語句的執(zhí)行。如果沒有執(zhí)行EXIT語句,則會成為無限循環(huán)。
何時測試循環(huán)結(jié)束條件
測試循環(huán)是否應該結(jié)束的判斷發(fā)生在循環(huán)體內(nèi)部,即EXIT或EXIT WHEN語句執(zhí)行時。
使用簡單循環(huán)的原因
使用簡單循環(huán)的主要原因包括:無法確定循環(huán)執(zhí)行的次數(shù)、要求循環(huán)至少執(zhí)行一次。簡單循環(huán)只有在執(zhí)行EXIT、EXIT WHEN或程序異常時才會停止執(zhí)行。
那么什么時候使用EXIT,什么時候使用EXIT WHEN呢?如果只有一個條件表達式?jīng)Q定循環(huán)是否應該結(jié)束,可以使用EXIT WHEN。如果存在多個退出條件,或者根據(jù)不同的退出條件設(shè)置“返回值”,則使用IF或CASE語句更合適,此時應使用EXIT語句。
下面是一個示例,輸出從startIndex到endIndex的數(shù)字:
PROCEDURE display_number(
startIndex IN INTEGER,
endIndex IN INTEGER
) AS
currentIndex INTEGER : startIndex;
BEGIN
LOOP
EXIT WHEN currentIndex > endIndex; --循環(huán)退出條件
DBMS_OUTPUT.PUT_LINE(currentIndex);
currentIndex : currentIndex 1;
END LOOP;
END;
我們可以使用簡單循環(huán)來模仿repeat until循環(huán),即循環(huán)體至少執(zhí)行一次。示例如下:
LOOP
--待執(zhí)行的語句
EXIT WHEN condition; --判斷退出條件
END LOOP;
系統(tǒng)監(jiān)控與簡單循環(huán)
有時為了監(jiān)控系統(tǒng)狀態(tài),需要讓簡單循環(huán)無限地執(zhí)行下去。但是由于系統(tǒng)資源消耗非常高,可以在執(zhí)行后暫停一段時間再繼續(xù)執(zhí)行,如下:
LOOP
--待執(zhí)行的語句
DBMS_(10); --10秒鐘內(nèi)不做任何事情
END LOOP;
如果想要終止這個無限循環(huán),可以在循環(huán)體中插入一個“命令解釋器”,然后通過數(shù)據(jù)庫內(nèi)置的進程間通訊機制發(fā)送命令,也稱為數(shù)據(jù)庫管道。示例如下:
DECLARE
pipename VARCHAR2(12) : 'signaler';
result INTEGER;
pipebuf VARCHAR2(64);
BEGIN
/* 創(chuàng)建一個指定名字的私有管道 */
result : DBMS__pipe(pipename);
LOOP
--待執(zhí)行的語句
DBMS_(10);
/* 檢查管道里是否有消息 */
IF DBMS__message(pipename, 0) 0 THEN
/* 解釋消息并采取動作 */
DBMS_PIPE.unpack_message(pipebuf);
EXIT WHEN pipebuf 'stop';
END IF;
END LOOP;
END;
現(xiàn)在可以構(gòu)造一個簡單的伙伴程序,通過發(fā)送一個“stop”消息到同一個管道中來終止循環(huán)的運行:
DECLARE
pipename VARCHAR2(12) : 'signaler';
result INTEGER : DBMS__pipe(pipename);
BEGIN
DBMS__message('stop');
END;
同樣地,也可以通過管道發(fā)送其他命令,如增加或減少休眠間隔。