我在.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
我认为它与缓冲区大小有关,但我不确定是什么/为什么。
非常感谢任何帮助!
答案 0 :(得分:3)
为什么不根据需要将结果附加到VARCHAR2变量,然后在行完成时put_line该字符串?这样你就可以控制格式了。
答案 1 :(得分: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.PUT
程序之后,将DBMS_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万。