- 先是那个最简单的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; /
这个是那个停止的,但是不好用。在找问题。
时间: 2024-10-02 23:13:40