简单循环的语法结构式所有循环结构中最基础的,它包括了一个LOOP和END LOOP关键字。语法如下:LOOP . . . 必须存在一条可执行语句END LOOP;特性:a)循环如何结束 简单循环是依赖循环体内部的EXIT语句的执行,如果没有执行EXIT语句,则成为无穷循环。b)什么时候测试是否该结束循环 这个测试是再循环体内部发生的,是再EXIT或者EXIT WHEN语句执行时发生的。c)使用这种循环的原因 不能确定循环会执行多少次、要求循环至少执行一次简单循环只有当执行EXIT、EXIT WHEN或者程序出现异常才停止执行。那么什么时候使用EXIT、什么时候使用EXIT WHEN呢?a)如果只有一个条件表达式决定循环是否应该结束,这种情况使用EXIT WHENb)如果有多个退出条件、或者要根据不同的退出条件设置“返回值”时,使用IF或者CASE语句更适合,这时应该使用EXIT语句。【如】输出从satrtIndex开始到endIndex的数字PROCEDURE display_number( startIndexININTEGER, endIndex IN INTEGER)AS currentIndex INTEGER :=startIndex;BEGINLOOPEXIT WHENcurrentIndex >endIndex; --循环退出条件 DBMS_OUTPUT.PUT_LINE(currentIndex); currentIndex :=currentIndex + 1; -- 将上面的三句代码重写 IFcurrentIndex >endIndexTHENEXIT; ELSE DBMS_OUTPUT.PUT_LINE(currentIndex); currentIndex :=currentIndex + 1; END IF;END LOOP;END;我们可以使用简单循环来模仿repeat until循环,repeat until循环要求在循环体中执行完毕后才测试,这种循环体部分至少会执行一次。如:LOOP . . . 待执行的语句 EXIT WHEN condition -- 判断退出条件END LOOP; 有时为了监控系统,那么我们就不得不让简单循环无限的循环下去。但是系统子资源消耗非常高,因此可以在执行后暂停一段时间再继续执行。如:LOOP . . . 待执行的语句 DBMS_LOCK.sleep(10); -- 10秒钟内不做任何事情END LOOP; 怎样来终止这个人为的无穷循环呢?最好的办法是,在循环体中插入一个“命令解释器”,然后通过数据库内置的进程间通讯机制来发送命令,这种机制也叫做数据库管道。如:DECLARE popenameCONSTANT VARCHAR2(12) := 'signaler'; result INTEGER; pipebuf VARCHAR2(64);BEGIN /* 创建一个指定名字的私有管道*/ result := DBMS_PIPE.create_pipe(pipename); LOOP . . . 待执行的语句 DBMS_LOCK.sleep(10); /* 检查管道里是否有消息 */ IF DBMS_PIPE.receive_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.create_pipe(pipename);BEGIN DBMS_PIPE.pack_message('stop');END;同样也可以通过管道发送其他命令——比如:增加或减少休眠间隔。
下一篇:怎么找租房信息