簡體   English   中英

如何正確輸出PL / SQL

[英]How to properly output PL/SQL

我在.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

我認為這與緩沖區大小有關,但是我不確定是什么原因。

任何幫助將不勝感激!

您為什么不只根據需要將結果附加到VARCHAR2變量,然后在完成行后將結果字符串放到該字符串上? 這樣,您就可以控制格式。

第二個存儲過程的代碼片段:

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 ,則應將數字數據類型的值作為參數而不是字符串傳遞。 是的,將進行數據類型的隱式轉換,但最好避免這種轉換。 緩沖區的最大大小為一百萬。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM