【DBMS】Oracle DBMS_OUTOUT程式介紹

xysoul_雲龍發表於2021-11-15

  該包通常用於除錯,或用於向 SQL*DBA 或 SQL*Plus 顯示訊息和報告

  此包中的PUT 過程和PUT_LINE 過程能夠將資訊放置在可由另一個觸發器、過程或包讀取的緩衝區中。

  在單獨的 PL/SQL 過程或匿名塊中, 您可以透過呼叫GET_LINE 過程和GET_LINES 過程來顯示緩衝的資訊。

  如果包被禁用,所有對子程式的呼叫都將被忽略。透過這種方式,您可以設計您的應用程式, 以便僅當客戶端能夠處理資訊時子程式才可用。


DBMS_OUTPUT 規則和限制

  • 最大行大小為 32767 位元組。

  • 預設緩衝區大小為 20000 位元組。最小大小為 2000 位元組,最大為無限制。


 DBMS_OUTPUT 子程式介紹

描述
描述
DISABLE Procedure 禁用訊息輸出

ENABLE Procedure

啟用訊息輸出

GET_LINE Procedure

從緩衝區中檢索一行

GET_LINES Procedure

從緩衝區檢索行陣列

NEW_LINE Procedure

終端使用建立的行,一行的結束

PUT Procedure

在緩衝區中放置部分行

PUT_LINE Procedure

將行放入緩衝區


下面主要介紹 三個過程。

PUT  PUT_LINE  NEW_LINE


示例:

--put和new_line
SQL> set serveroutput on; --顯示結果
begin
   dbms_output.put('a'); --寫入buffer但不輸出
   dbms_output.put('b'); --寫入buffer但不輸出
   dbms_output.new_line; --回車(換行),輸出                              
   dbms_output.put_line('hello world!'); --輸出並換行 
   dbms_output.put('d'); --寫入buffer但不輸出 
end;                                                     
/ SQL>   2    3    4    5    6    7    8  
ab
hello world!
PL/SQL procedure successfully completed.
SQL>


注:使用get_line時不能用put_line輸出,因為put_line之後會將buffer清空。(當然在serveroutput off的情況下put_line是不影響buffer的)。


示例:

--get_line
declare
   msg varchar2(120);                               
   cursor t_cur is select * from t order by a;      
   v_line varchar2(100);                            
   v_status integer := 0;                           
begin                                           
   dbms_output.enable;                              
   for i in t_cur loop                              
       msg := i.a || ',' || i.b || ',' || i.c;          
       dbms_output.put_line(msg); --put                   
   end loop;                                       
                                                  
   dbms_output.get_line(v_line, v_status); --get          
   while v_status = 0 loop                         
       insert into tt values(v_status, v_line);        
       dbms_output.get_line(v_line, v_status);          
   end loop;                                       
end;                                            
/                                               
--get_lines
set serveroutput on;
declare
   v_data dbms_output.chararr;                          
   v_numlines number;                                   
begin                                               
   --enable the buffer first.                          
   dbms_output.enable(1000000);                         
                                                      
   dbms_output.put_line('line one');                    
   dbms_output.put_line('line two');                    
   dbms_output.put_line('line three');                 
                                                      
   v_numlines := 3;                                    
   dbms_output.get_lines(v_data, v_numlines);  --array, index        
   for v_counter in 1..v_numlines loop                 
       dbms_output.put_line(v_data(v_counter));            
   end loop;                                           
end;                                                
/


參考:

  • https://www.cnblogs.com/forestwolf/p/4885160.html

  • 官方文件

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29487349/viewspace-2842277/,如需轉載,請註明出處,否則將追究法律責任。

相關文章