0

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

这是代码的链接:http: //pastebin.com/z29emmBJ (代码的相关部分围绕行:97-103)

当我在过程中使用 DBMS_OUTPUT.PUT_LINE() 时,一切都正确显示,但是当我在过程中使用 DBMS_OUTPUT.PUT() 时,看起来该函数永远不会被调用。

以下是使用 PUT_LINE() 的输出:http: //i.imgur.com/AnCv9.png 以下是仅使用 PUT() 的输出:http: //i.imgur.com/Jv3SV.png

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

任何帮助将不胜感激!

4

2 回答 2

3

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

于 2012-10-22T02:58:53.033 回答
1

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

FOR player IN rows LOOP
   currentCount := maxCount;
   DBMS_OUTPUT.PUT(player.FIRSTNAME || ' ' || player.LASTNAME || ':' || player.points || ' ');
   --DBMS_OUTPUT.NEW_LINE();
END LOOP;

如果您希望结果输出显示为单行,您应该移到 DBMS_OUTPUT.NEW_LINE()循环之外(循环之后)。所以你的代码看起来像:

FOR player IN rows LOOP
  currentCount := maxCount;
  DBMS_OUTPUT.PUT(player.FIRSTNAME || ' ' || player.LASTNAME || ':' || player.points || ' ');         
END LOOP;
DBMS_OUTPUT.NEW_LINE();

在您模拟过程之后保持DBMS_OUTPUT.NEW_LINE();在循环内。DBMS_OUTPUT.PUTDBMS_OUTPUT.PUT_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_OUTPUT.enable过程。如果它碰巧被调用,DBMS_OUTPUT.enable那么数值数据类型的值应该作为参数而不是字符串传递。是的,会有数据类型的隐式转换,但最好避免它。缓冲区的最大大小为 100 万。

于 2012-10-22T06:50:41.133 回答