如何正确输出PL/SQL

如何正确输出PL/SQL,sql,oracle,plsql,Sql,Oracle,Plsql,我在一个.sql文件中有两块代码。一个块是函数,另一个是过程。在第一个块中,我运行一个查询并将它打印到屏幕上(我使用DBMS_OUTPUT.PUT_LINE()),用于它自己行中的每一行。然后,该过程有另一个查询需要打印在同一行上(我使用的是DBMS_OUTPUT.PUT())。当我对第二个块使用DBMS_OUTPUT.PUT()时,由于某种原因,它会使第一个块出错,并且第一个块永远不会打印 以下是代码的链接: (代码的相关部分在第97-103行附近) 当我在过程中使用DBMS_OUTPUT.P

我在一个.sql文件中有两块代码。一个块是函数,另一个是过程。在第一个块中,我运行一个查询并将它打印到屏幕上(我使用DBMS_OUTPUT.PUT_LINE()),用于它自己行中的每一行。然后,该过程有另一个查询需要打印在同一行上(我使用的是DBMS_OUTPUT.PUT())。当我对第二个块使用DBMS_OUTPUT.PUT()时,由于某种原因,它会使第一个块出错,并且第一个块永远不会打印

以下是代码的链接: (代码的相关部分在第97-103行附近)

当我在过程中使用DBMS_OUTPUT.PUT_LINE()时,所有内容都会正确显示,但当我在过程中使用DBMS_OUTPUT.PUT()时,看起来该函数从未被调用

下面是PUT_LINE()的输出结果: 以下是just PUT()的输出:

我认为这与缓冲区大小有关,但我不太确定是什么/为什么


任何帮助都将不胜感激

为什么不根据需要将结果附加到VARCHAR2变量,然后在行完成时将该字符串放在行中?这样您就可以控制格式了。

为什么不根据需要将结果附加到VARCHAR2变量,然后在行完成时将该字符串放在行中?这样您就可以控制格式设置。

第二个存储过程的代码片段:

FOR player IN rows LOOP
   currentCount := maxCount;
   DBMS_OUTPUT.PUT(player.FIRSTNAME || ' ' || player.LASTNAME || ':' || player.points || ' ');
   --DBMS_OUTPUT.NEW_LINE();
END LOOP;
如果希望结果输出显示为一行,则应将
DBMS\u output.NEW\u line()
移动到循环外部(循环之后)。因此,您的代码如下所示:

FOR player IN rows LOOP
  currentCount := maxCount;
  DBMS_OUTPUT.PUT(player.FIRSTNAME || ' ' || player.LASTNAME || ':' || player.points || ' ');         
END LOOP;
DBMS_OUTPUT.NEW_LINE();
保持
DBMS_输出.NEW_行()DBMS\u输出之后的循环内进行code>操作。PUT
您只需模拟
DBMS\u输出。PUT\u LINE
过程

SQL> create or replace procedure output1
  2  is
  3    l_str varchar2(100);
  4    l_status number;
  5  begin
  6    for i in 1..7
  7    loop
  8      dbms_output.put('Text_' || To_char(i));
  9      dbms_output.new_line;
 10    end loop;
 11  end;
 12  /

Procedure created

SQL> 
SQL> create or replace procedure output2
  2  is
  3    l_str varchar2(100);
  4    l_status number;
  5  begin
  6    for i in 1..7
  7    loop
  8      dbms_output.put('Text_' || To_char(i));
  9     end loop;
 10     dbms_output.new_line;
 11  end;
 12  /

Procedure created

SQL> exec output1;

Text_1
Text_2
Text_3
Text_4
Text_5
Text_6
Text_7

PL/SQL procedure successfully completed

SQL> exec output2;

Text_1Text_2Text_3Text_4Text_5Text_6Text_7

PL/SQL procedure successfully completed

在代码中:

SET serveroutput ON size 32000;

REM Change output file name TO proj3-NetID.OUT!
SPOOL proj3-hgeorge3.OUT;
exec DBMS_OUTPUT.enable('100000000');

如果使用了
serveroutput
选项(设置为ON),则无需调用
DBMS\u OUTPUT.enable
过程。如果它碰巧调用了
DBMS\u OUTPUT.enable
,那么数字数据类型的值应该作为参数而不是字符串传入。是的,会有数据类型的隐式转换,但最好避免这种转换。缓冲区的最大大小为100万。

第二个存储过程的代码片段:

FOR player IN rows LOOP
   currentCount := maxCount;
   DBMS_OUTPUT.PUT(player.FIRSTNAME || ' ' || player.LASTNAME || ':' || player.points || ' ');
   --DBMS_OUTPUT.NEW_LINE();
END LOOP;
如果希望结果输出显示为一行,则应将
DBMS\u output.NEW\u line()
移动到循环外部(循环之后)。因此,您的代码如下所示:

FOR player IN rows LOOP
  currentCount := maxCount;
  DBMS_OUTPUT.PUT(player.FIRSTNAME || ' ' || player.LASTNAME || ':' || player.points || ' ');         
END LOOP;
DBMS_OUTPUT.NEW_LINE();
保持
DBMS_输出.NEW_行()DBMS\u输出之后的循环内进行code>操作。PUT
您只需模拟
DBMS\u输出。PUT\u LINE
过程

SQL> create or replace procedure output1
  2  is
  3    l_str varchar2(100);
  4    l_status number;
  5  begin
  6    for i in 1..7
  7    loop
  8      dbms_output.put('Text_' || To_char(i));
  9      dbms_output.new_line;
 10    end loop;
 11  end;
 12  /

Procedure created

SQL> 
SQL> create or replace procedure output2
  2  is
  3    l_str varchar2(100);
  4    l_status number;
  5  begin
  6    for i in 1..7
  7    loop
  8      dbms_output.put('Text_' || To_char(i));
  9     end loop;
 10     dbms_output.new_line;
 11  end;
 12  /

Procedure created

SQL> exec output1;

Text_1
Text_2
Text_3
Text_4
Text_5
Text_6
Text_7

PL/SQL procedure successfully completed

SQL> exec output2;

Text_1Text_2Text_3Text_4Text_5Text_6Text_7

PL/SQL procedure successfully completed

在代码中:

SET serveroutput ON size 32000;

REM Change output file name TO proj3-NetID.OUT!
SPOOL proj3-hgeorge3.OUT;
exec DBMS_OUTPUT.enable('100000000');

如果使用了
serveroutput
选项(设置为ON),则无需调用
DBMS\u OUTPUT.enable
过程。如果它碰巧调用了
DBMS\u OUTPUT.enable
,那么数字数据类型的值应该作为参数而不是字符串传入。是的,会有数据类型的隐式转换,但最好避免这种转换。缓冲区的最大大小为100万。

您是否尝试添加
DBMS\u OUTPUT.NEW\u LINE()在循环之后?我的意思是在所有的
DBMS\u OUTPUT.PUT()
命令之后?您是否尝试添加
DBMS\u OUTPUT.NEW\u LINE()在循环之后?我的意思是在所有的
DBMS\u OUTPUT.PUT()
命令之后?对于您的回答的第一部分:我不能把它放在外面,因为任务要求我们基本上构建三角形,所以它看起来像:第1行(\n)第2行,第3行(\n)第4行,第5行,第6行(\n)第7行,第8行,第9行,第10行(\n)第11行,第12行,第13行,第14行(\n)回答的第一部分:我不能把它放在外面,因为作业要求我们基本上建立三角形,所以它看起来像:第1行(\n)第2行,第3行(\n)第4行,第5行,第6行(\n)第7行,第8行,第9行,第10行(\n)第11行,第12行,第13行,第14行(\n)等等。这是个好主意。我觉得自己很傻,没有先想到那件事。谢谢那是个好主意。我觉得自己很傻,没有先想到那件事。谢谢