在 dbms_output.put_line 和 dbms_output.put pl/sql 之间混淆

Posted

技术标签:

【中文标题】在 dbms_output.put_line 和 dbms_output.put pl/sql 之间混淆【英文标题】:confused between dbms_output.put_line and dbms_output.put pl/sql 【发布时间】:2014-10-25 19:05:46 【问题描述】:

我试图做这样的事情 输入时:5

它会打印 A B C D E

输入:10

打印 A B C D E J I H G F

输入:15

打印 A B C D E J I H G F K L M N O

输入:20 A B C D E J I H G F K L M N O T S R Q P

等等…… 这是我创建的代码

    declare
    angka number := '&Angka';
    i number := trunc(angka/5);
    p number := 65;
    a number := 1;
    b number := 1;
begin
    while a <= b loop
    if mod(i,2) = 1 then
        a := 5;
        for b in 1..5 loop
            p := p + a
            dbms_output.put( chr(p) || ' ' );
            a := a - 1;
        end loop;
        p := p + 5;
    else
        a := 1;
        for b in 1..5 loop
            p := p + a
            dbms_output.put( chr(p) || ' ' );
            a := a + 1;
        end loop;
    end loop;
    dbms_output.put_line(' ');
end;
/

但我仍然很困惑它仍然没有工作 关于 dbms_output.put_line vs dbms_output.put 有人可以解释一下吗?因为我正在尝试使用 dbms_output.put 打印它没有显示.. 我不知道为什么

谢谢

【问题讨论】:

【参考方案1】:

首先,p := p + a 行没有以分号结束。理想情况下,PL/SQL 匿名块首先不应该编译。

其次,使用PUT 程序,您还没有完成该行。它需要GET_LINES 从缓冲区中检索行数组。

有一个类似的问题,Is dbms_output.put() being buffered differently from dbms_output.put_line()?

【讨论】:

【参考方案2】:

您的代码中存在一些问题。我不相信您可以完全执行此代码。可能是您忘记复制其中的某些部分。

首先,语法错误:

declare
    angka number := '&Angka';
    i number := trunc(angka/5);
    p number := 65;
    a number := 1;
    b number := 1;
begin
    while a <= b loop
    if mod(i,2) = 1 then
        a := 5;
        for b in 1..5 loop
            p := p + a  -- ";" missed
            dbms_output.put( chr(p) || ' ' );
            a := a - 1;
        end loop;
        p := p + 5;
    else
        a := 1;
        for b in 1..5 loop
            p := p + a  -- ";" missed
            dbms_output.put( chr(p) || ' ' );
            a := a + 1;
        end loop;
   -- here you missed "end if" 
    end loop;
dbms_output.put_line(' ');
end;
/

您也不需要外部循环(“while a

for b in 1..5 loop

oracle 在此处创建名为“b”的新变量,并且在循环中先前声明的 b 不可见。尝试执行此操作:

declare
  b number := 111;
begin
  for b in 1..5 loop
    dbms_output.put_line(b);
  end loop;
  dbms_output.put_line(b);
end;
/

你会得到:

1
2
3
4
5
111

如果您更正这些错误,您的代码将按您的意愿运行。

【讨论】:

以上是关于在 dbms_output.put_line 和 dbms_output.put pl/sql 之间混淆的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 中的dbms_output.put_line

Oracle 中的dbms_output.put_line

dbms_output.put_line 的替代方案

DBMS_OUTPUT.PUT_LINE 抛出“PL/SQL:数字或值错误”

使用 DBMS_OUTPUT.put_line 显示错误消息

dbms_output.put_line 不能与游标一起正常工作