原文链接 http://www.blogjava.net/decode360/archive/2009/06/06/282867.html
虽然一直在使用DBMS_OUTPUT.PUT_LINE,但是说实话没有仔细研究过DBMS_OUTPUT包中的其他方法和函数的用法,所以这次特地来研究一下。 先简单的讲解一下这个包的所有procedure的含义及作用: ----------------------- 1、enable:在serveroutput on的情况下,用来使dbms_output生效(默认即打开) 2、disable:在serveroutput on的情况下,用来使dbms_output失效 3、put:将内容写到内存,等到put_line时一起输出 4、put_line:不用多说了,输出字符 5、new_line:作为一行的结束,可以理解为写入buffer时的换行符 6、get_line:获取没有输出的buffer中的信息 7、get_lines:以数组形式来获取所有buffer中的信息 需要注意以下几点: ----------------------- 1、set serveroutput on:如果要在sqlplus中看到dbms_output的输出, 则必须设置该参数值为on 2、每行能容纳的最大值是32767bytes 3、buffer的默认值是20000bytes,可设置的最小值为2000bytes,最大值为1000000bytes 来看一下Package中自带的说明: ----------------------- create or replace package sys.dbms_output as -- DE-HEAD <- tell SED where to cut when generating fixed package ------------ -- OVERVIEW -- -- These procedures accumulate information in a buffer (via "put" and -- "put_line") so that it can be retrieved out later (via "get_line" or -- "get_lines"). If this package is disabled then all -- calls to this package are simply ignored. This way, these routines -- are only active when the client is one that is able to deal with the -- information. This is good for debugging, or SP's that want to want -- to display messages or reports to sql*dba or plus (like 'describing -- procedures', etc.). The default buffer size is 20000 bytes. The -- minimum is 2000 and the maximum is 1,000,000. ----------- -- EXAMPLE -- -- A trigger might want to print out some debugging information. To do -- do this the trigger would do -- dbms_output.put_line('I got here:'||:new.col||' is the new value'); -- If the client had enabled the dbms_output package then this put_line -- would be buffered and the client could, after executing the statement -- (presumably some insert, delete or update that caused the trigger to -- fire) execute -- begin dbms_output.get_line(:buffer, :status); end; -- to get the line of information back. It could then display the -- buffer on the screen. The client would repeat calls to get_line -- until status came back as non-zero. For better performance, the -- client would use calls to get_lines which can return an array of -- lines. -- -- SQL*DBA and SQL*PLUS, for instance, implement a 'SET SERVEROUTPUT -- ON' command so that they know whether to make calls to get_line(s) -- after issuing insert, update, delete or anonymous PL/SQL calls -- (these are the only ones that can cause triggers or stored procedures -- to be executed). ------------ -- SECURITY -- -- At the end of this script, a public synonym (dbms_output) is created -- and execute permission on this package is granted to public. ---------------------------- -- PROCEDURES AND FUNCTIONS -- procedure enable (buffer_size in integer default 20000); pragma restrict_references(enable,WNDS,RNDS); -- Enable calls to put, put_line, new_line, get_line and get_lines. -- Calls to these procedures are noops if the package has -- not been enabled. Set default amount of information to buffer. -- Cleanup data buffered from any dead sessions. Multiple calls to -- enable are allowed. -- Input parameters: -- buffer_size -- Amount of information, in bytes, to buffer. Varchar2, number and -- date items are stored in their internal representation. The -- information is stored in the SGA. An error is raised if the -- buffer size is exceeded. If there are multiple calls to enable, -- then the buffer_size is generally the largest of the values -- specified, and will always be >= than the smallest value -- specified. Currently a more accurate determination is not -- possible. The maximum size is 1,000,000, the minimum is 2000. procedure disable; pragma restrict_references(disable,WNDS,RNDS); -- Disable calls to put, put_line, new_line, get_line and get_lines. -- Also purge the buffer of any remaining information. procedure put(a varchar2); pragma restrict_references(put,WNDS,RNDS); -- Put a piece of information in the buffer. When retrieved by -- get_line(s), the number and date items will be formated with -- to_char using the default formats. If you want another format -- then format it explicitly. -- Input parameters: -- a -- Item to buffer procedure put_line(a varchar2); pragma restrict_references(put_line,WNDS,RNDS); -- Put a piece of information in the buffer followed by an end-of-line -- marker. When retrieved by get_line(s), the number and date items -- will be formated with to_char using the default formats. If you -- want another format then format it explicitly. get_line(s) return -- "lines" as delimited by "newlines". So every call to put_line or -- new_line will generate a line that will be returned by get_line(s). -- Input parameters: -- a -- Item to buffer -- Errors raised: -- -20000, ORU-10027: buffer overflow, limit of <buf_limit> bytes. -- -20000, ORU-10028:line length overflow, limit of 32767 bytes per line. procedure new_line; pragma restrict_references(new_line,WNDS,RNDS); -- Put an end-of-line marker. get_line(s) return "lines" as delimited -- by "newlines". So every call to put_line or new_line will generate -- a line that will be returned by get_line(s). procedure get_line(line out varchar2, status out integer); pragma restrict_references(get_line,WNDS,RNDS); -- Get a single line back that has been buffered. The lines are -- delimited by calls to put_line or new_line. The line will be -- constructed taking all the items up to a newline, converting all -- the items to varchar2, and concatenating them into a single line. -- If the client fails to retrieve all lines before the next put, -- put_line or new_line, the non-retrieved lines will be discarded. -- This is so if the client is interrupted while selecting back -- the information, there will not be junk left over which would -- look like it was part of the NEXT set of lines. -- Output parameters: -- line -- This line will hold the line - it may be up to 32767 bytes long. -- status -- This will be 0 upon successful completion of the call. 1 means -- that there are no more lines. type chararr is table of varchar2(32767) index by binary_integer; procedure get_lines(lines out chararr, numlines in out integer); pragma restrict_references(get_lines,WNDS,RNDS); -- Get multiple lines back that have been buffered. The lines are -- delimited by calls to put_line or new_line. The line will be -- constructed taking all the items up to a newline, converting all -- the items to varchar2, and concatenating them into a single line. -- Once get_lines is executed, the client should continue to retrieve -- all lines because the next put, put_line or new_line will first -- purge the buffer of leftover data. This is so if the client is -- interrupted while selecting back the information, there will not -- be junk left over. -- Input parameters: -- numlines -- This is the maximum number of lines that the caller is prepared -- to accept. This procedure will not return more than this number -- of lines. -- Output parameters: -- lines -- This array will line will hold the lines - they may be up to 32767 -- bytes long each. The array is indexed beginning with 0 and -- increases sequentially. From a 3GL host program the array begins -- with whatever is the convention for that language. -- numlines -- This will be the number of lines actually returned. If it is -- less than the value passed in, then there are no more lines. --FIXED_ONLYTYPE dbmsoutput_linesarray IS VARRAY(2147483647) OF --FIXED_ONLY VARCHAR2(32767); procedure get_lines(lines out dbmsoutput_linesarray, numlines in out integer); -- get_lines overload with dbmsoutput_linesarray varray type for lines. -- It is recommended that you use this overload in a 3GL host program to -- execute get_lines from a PL/SQL anonymous block. pragma restrict_references(get_lines,WNDS,RNDS); pragma TIMESTAMP('2000-06-22:11:21:00'); end; -- CUT_HERE <- tell sed where to chop off the rest 下面举几个例子来说明一些不常用的方法的使用: 例子1:(put和new_line) ----------------------- SQL> set serveroutput on SQL> begin 2 dbms_output.put_line('three names will be written.'); 3 dbms_output.put('j'); --增加至buffer 4 dbms_output.new_line; --回车 5 dbms_output.put('s'); --增加至buffer 6 dbms_output.new_line; --回车 7 dbms_output.put('t'); --增加至buffer 8 dbms_output.new_line; --回车 9 dbms_output.put_line('over.'); --与之前所有一起输出 10 end; 11 / three names will be written. j s t over. PL/SQL procedure successfully completed 例子2:(put_line) ----------------------- SQL> set serveroutput off; SQL> create table t(a int,b int,c int); Table created SQL> insert into t values(111111,222222,333333); 1 row inserted SQL> insert into t values(444444,555555,666666); 1 row inserted SQL> insert into t values(777777,888888,999999); 1 row inserted SQL> create table tt(a int,b varchar2(100)); Table created SQL> declare 2 msg varchar2(120); 3 cursor t_cur is select * from t order by a; 4 v_line varchar2(100); 5 v_status integer := 0; 6 begin 7 dbms_output.enable; 8 for i in t_cur loop 9 msg := i.a || ',' || i.b || ',' || i.c; 10 dbms_output.put_line(msg); 11 end loop; 12 13 dbms_output.get_line(v_line,v_status); 14 while v_status = 0 loop 15 insert into tt values(v_status, v_line); 16 dbms_output.get_line(v_line,v_status); 17 end loop; 18 end; 19 / PL/SQL procedure successfully completed SQL> select * from tt; A B --- ------------------------------ 0 111111,222222,333333 0 444444,555555,666666 0 777777,888888,999999 注:使用get_line时不能用put_line输出,因为put_line之后会将buffer清空。 (当然在serveroutput off的情况下put_line是不影响buffer的) 例子3:(put_lines) ----------------------- SQL> set serveroutput on SQL> declare 2 v_data dbms_output.chararr; 3 v_numlines number; 4 begin 5 -- enable the buffer first. 6 dbms_output.enable(1000000); 7 8 dbms_output.put_line('line one'); 9 dbms_output.put_line('line two'); 10 dbms_output.put_line('line three'); 11 12 v_numlines := 3; 13 dbms_output.get_lines(v_data, v_numlines); 14 for v_counter in 1..v_numlines loop 15 dbms_output.put_line(v_data(v_counter)); 16 end loop; 17 end; 18 / line one line two line three PL/SQL procedure successfully completed 注意数组使用的格式。