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