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;
同样地,也可以通过管道发送其他命令,如增加或减少休眠间隔。