for循环后的最后一个过程语句在pl sql中不起作用
Posted
技术标签:
【中文标题】for循环后的最后一个过程语句在pl sql中不起作用【英文标题】:last statement of procedure after for loop is not working in pl sql 【发布时间】:2015-09-28 10:35:55 【问题描述】:我创建了以下测试过程,我正在打印调试消息,我发现 for 循环之后的最后一个过程语句不起作用。为什么 ?
在以下情况下,我无法打印第三个 for 循环的调试消息,您可以在处理后找到结果:
CREATE OR REPLACE PROCEDURE TEST_SCRIPT AS
BEGIN
DBMS_OUTPUT.enable;
DBMS_OUTPUT.PUT('-- Before for loop --');
for rec in (
SELECT sysdate FROM DUAL
) loop
DBMS_OUTPUT.NEW_LINE();
DBMS_OUTPUT.PUT('-- inside for loop --');
end loop;
DBMS_OUTPUT.NEW_LINE();
DBMS_OUTPUT.PUT('-- after for loop --');
for rec in (
SELECT sysdate FROM DUAL
) loop
DBMS_OUTPUT.NEW_LINE();
DBMS_OUTPUT.PUT('-- second loop --');
end loop;
for rec in (
SELECT sysdate FROM DUAL
) loop
DBMS_OUTPUT.NEW_LINE();
DBMS_OUTPUT.PUT('-- third loop --');
end loop;
END TEST_SCRIPT;
结果:
-- Before for loop --
-- inside for loop --
-- after for loop --
-- second loop --
Process exited.
【问题讨论】:
【参考方案1】:尝试使用
DBMS_OUTPUT.PUT_LINE
而不是 DBMS_OUTPUT.PUT
【讨论】:
【参考方案2】:该输出背后的原因是,DBMS_OUTPUT.PUT 将 line 放在缓冲区中,而您对 DBMS_OUTPUT.NEW_LINE()
的调用返回 line 放在缓冲区中。
所以,这里您的 DBMS_OUTPUT.PUT('-- Before for loop --');
由您在第一个 for 循环中提到的 DBMS_OUTPUT.NEW_LINE()
调用返回。
同样,其他电话也发生了同样的事情,因为DBMS_OUTPUT.PUT('-- third loop --');
不存在DBMS_OUTPUT.NEW_LINE()
所以它没有被打印出来。
要打印它,只需在下面更改--
.....
for rec in (
SELECT sysdate FROM DUAL
) loop
DBMS_OUTPUT.NEW_LINE();
DBMS_OUTPUT.PUT('-- third loop --');
DBMS_OUTPUT.NEW_LINE();
end loop;
..
【讨论】:
【参考方案3】:它实际上也在执行第三个循环你需要在DBMS_OUTPUT.PUT('-- third loop --');
之后添加DBMS_OUTPUT.NEW_LINE();
【讨论】:
【参考方案4】:修改你的最后一个循环,如下所示。
for rec in (
SELECT sysdate FROM DUAL
) loop
DBMS_OUTPUT.NEW_LINE();
DBMS_OUTPUT.PUT('-- third loop --');
DBMS_OUTPUT.NEW_LINE();
end loop;
原因:
在 DBMS_OUTPUT.NEW_LINE() 调用之前,只有数据会显示在放置缓冲区中。
编辑
通过编辑您的代码..
CREATE OR REPLACE PROCEDURE TEST_SCRIPT AS
BEGIN
DBMS_OUTPUT.PUT('-- Before for loop --');
DBMS_OUTPUT.NEW_LINE();
for rec in (
SELECT sysdate FROM DUAL
) loop
DBMS_OUTPUT.PUT('-- inside for loop --');
DBMS_OUTPUT.NEW_LINE();
end loop;
DBMS_OUTPUT.PUT('-- after for loop --');
DBMS_OUTPUT.NEW_LINE();
for rec in (
SELECT sysdate FROM DUAL
) loop
DBMS_OUTPUT.PUT('-- second loop --');
DBMS_OUTPUT.NEW_LINE();
end loop;
for rec in (
SELECT sysdate FROM DUAL
) loop
DBMS_OUTPUT.PUT('-- third loop --');
DBMS_OUTPUT.NEW_LINE();
end loop;
END TEST_SCRIPT;
【讨论】:
对于超过一行的游标查询 - 希望 OP 确实有,否则为什么要循环 - 将额外的new_line
放在循环内会给出空行; 在循环之后有一个最后一个会更干净吗?或者将所有循环更改为只有 new_line
在末尾;不清楚是否有理由这样做,而不是使用put_line
。以上是关于for循环后的最后一个过程语句在pl sql中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Liquid - if contains 语句在 for 循环中不起作用