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