2012-10-22 48 views
0

我在.sql文件中有兩段代碼。一個塊是一個功能,另一個是程序。在第一個模塊中,我正在運行一個查詢並將其打印到屏幕上(我正在使用DBMS_OUTPUT.PUT_LINE()),以便爲它自己的行中的每一行。然後該過程有另一個查詢需要打印在同一行(我正在使用DBMS_OUTPUT.PUT())。當我爲第二個塊使用DBMS_OUTPUT.PUT()時,由於某種原因它將第一個塊關閉,並且第一個塊從不打印。如何正確輸出PL/SQL

下面是代碼的鏈接:http://pastebin.com/z29emmBJ (代碼的相關部分大約是線:97-103)

當我有DBMS_OUTPUT.PUT_LINE()的程序內使用,一切正常顯示,但是當我在過程中有DBMS_OUTPUT.PUT()時,它看起來像函數永遠不會被調用。

這裏的輸出會變成什麼樣子PUT_LINE():http://i.imgur.com/AnCv9.png 這裏的輸出會變成什麼樣子只是把():http://i.imgur.com/Jv3SV.png

我認爲這是與緩衝區的大小,但我不完全確定什麼/爲什麼。

任何幫助將不勝感激!

+0

您是否嘗試在循環後添加'DBMS_OUTPUT.NEW_LINE();'?我的意思是畢竟'DBMS_OUTPUT.PUT()'命令? –

回答

3

爲什麼不按照需要將結果附加到VARCHAR2變量,然後在行完成時put_line該字符串?這樣你就可以控制格式。

+0

這是一個好主意。我首先不考慮這個問題,我覺得很愚蠢。謝謝! –

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萬。

+0

您的答覆的第一部分: 我不能把它之外,因爲分配要我們基本建成三角形,所以它看起來像: 第1行(\ n)的 行2,行3(\ n)的 第4行,第5行,第6行(\ n)的 第7行,第8行,第9行,第10行(\ n)的 列11,行12,行13,行14 (\ n) etc –