Oracle PL/SQL程序设计 第五版 上册 第五章 用循环进行迭代处理

  1. 先是那个最简单的LOOP循环

loop.sql
CREATE OR REPLACE PROCEDURE loop_demo
    AUTHID CURRENT_USER
IS
    l_date DATE;
BEGIN
    l_date := SYSDATE;
    LOOP
        EXIT WHEN l_date > SYSDATE + 10;
        l_date := l_date + 1;
        DBMS_OUTPUT.PUT_LINE(l_date);
    END LOOP;
END loop_demo;
/

首先一点,我这个过程没有参数,那么我在创建那句,后面就没有括号。

还有下面 l_date := l_date + 1;

我开始使用 l_date += 1;   l_date  :+= 1;   l_date ++;我开始试了一下这三种,后来都不成功,

才改成了现在这样的格式,看来是不支持。

BEGIN
    loop_demo();
END;
/

这样直接执行就可以看看结果了。


2. 然后是简单的for循环,使用数值的。

for.sql
CREATE OR REPLACE PROCEDURE for_demo
    AUTHID CURRENT_USER
IS
    l_date DATE;
BEGIN
    FOR i IN 1 .. 10
    LOOP
        l_date := SYSDATE + i;
        DBMS_OUTPUT.PUT_LINE(l_date);
    END LOOP;
END for_demo;
/

然后还可以使用游标的。

先用一个select语句来当IN的集合

CREATE OR REPLACE PROCEDURE for_select
    AUTHID CURRENT_USER
IS
BEGIN
    FOR cur IN (SELECT ENAME FROM EMP)
    LOOP
        DBMS_OUTPUT.PUT_LINE(cur.ename);
    END LOOP;
END;
/


3. 下面是while的练习

CREATE OR REPLACE PROCEDURE while_demo
    AUTHID CURRENT_USER
IS
    l_date DATE;
BEGIN
    l_date := SYSDATE;
    WHILE l_date < SYSDATE + 15
    LOOP
        l_date := l_date + 1;
        DBMS_OUTPUT.PUT_LINE(l_date);
    END LOOP;
END while_demo;
/

然后我在书中看到了sleep函数,这个我就想试试,但是跟我想的结果不一样。

CREATE OR REPLACE PROCEDURE while_demo
    AUTHID CURRENT_USER
IS
    l_date DATE;
BEGIN
    l_date := SYSDATE;
    WHILE l_date < SYSDATE + 15
    LOOP
        l_date := l_date + 1;
        DBMS_OUTPUT.PUT_LINE(l_date);
        DBMS_LOCK.sleep(1);
    END LOOP;
END while_demo;
/

首先要用DBMS_LOCK需要有权限。在管理员下

grant execute on DBMS_LOCK to scott;

我以为是每循环一次停一下,但是实际情况却是,一直在停着,停到了15秒后,才全部打印出来。

这个是怎么回事呢?


还有一个就是下面有一个用管道的,但是我就没有成功过,一直都是在卡着,不会退出,并且明明给了sleep时间应该过了。

DECLARE
    pipename CONSTANT VARCHAR2(12) := ‘signaler1‘;
    result INTEGER;
    pipebuf VARCHAR2(64);
BEGIN
    result := DBMS_PIPE.create_pipe(pipename);
    LOOP
        DBMS_LOCK.sleep(5);
        IF DBMS_PIPE.receive_message(pipename, 0) = 0
        THEN
            DBMS_PIPE.unpack_message(pipebuf);
            EXIT WHEN pipebuf = ‘stop‘;
        END IF;
    END LOOP;
END;
/

在这里有过一个问题,我当时给scott那个DBMS_PIPE的权限后,忘了进入这个用户了,直接用sys就运行了,然后退出再

用scott运行就不行了,报错,后来应该是用sys的时候把个管道创建了,scott用不上这个了就。后来我改了另一个名字。

但是,我的为什么就不能退出呢。。。

DECLARE
    pipename VARCHAR2(12) := ‘signaler1‘;
    result INTEGER := DBMS_PIPE.create_pipe(pipename);
BEGIN
    DBMS_PIPE.pack_message(‘stop‘);
END;
/

这个是那个停止的,但是不好用。在找问题。









郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。