| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.misc -> Re: Help with DBMS_OUTPUT
This is a multi-part message in MIME format.
--------------15A01C42FC0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Ed Jennings wrote:
>
> I'm using DBMS_OUTPUT in a stored procedure that print a key value
> after doing some computations and an insert. When I run this
> procedure from SQLPlus, I get no output until the stored proc is
> finished. I then get pummelled with a few hundred lines of output.
> The stored proc takes about 15 minutes to execute, therefore I can only
> assume that the output is being buffered somehow. Does anyone know if
> this is the case, and if there is a way to turn it off? I want
> to monitor the progress during runtime, and currently the output
> is of little use.
> --
> ~~~~~~~~~~~~~~~~~~~~~~~~~
> jennings_at_dca.net
OK, since I have seen this same problem come up again and again, I *will* post my debug package. So there. ;-)
By the way, I wrote this *years* ago (about 4) and was pleased that Steve Feuerstein(sp?) had something similar in his PL/SQL Programming book. It's really a simple solution.
The package is in debugpkg.sql. You need to have dbms_pipe and dbms_output installed. In your package or trigger code, put a line like:
debug.put('This is my message here, variable = ' || :new.variable); or whatever you want to see output of. Then, you can enable debugging one of two ways:
Enjoy!
--
Diana Duncan | My opinions are my own.
Sr. Consultant |
REALOGIC, Inc. | Excitement, Adventure and
dduncan_at_realogic.com | Really Wild Things - Z.B.
--------------15A01C42FC0
Content-Type: text/plain; charset=us-ascii; name="Debugpkg.sql"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="Debugpkg.sql"
drop package debug;
create package debug is
-- Place debug.put statements in PL/SQL.
procedure put (msg in varchar2 default '');
-- To see the debugging statements in another Oracle session as they are
-- executed, you must
-- 1) enable debugging in the session that will be executing the code
-- 2) run the program/SQL statement
-- 3) in another SQL*Plus session, SET SERVEROUT ON
-- 4) enable debugging
-- 5) make repeated calls to debug.get
--
-- To see the debugging statements after execution in the same Oracle
-- session as they are executed, you must
-- 1) SET SERVEROUT ON
-- 2) enable debugging with the immediate flag on, debug.enable(TRUE);
-- 3) run the program/SQL statement
--
procedure get;
procedure enable (imm in boolean default FALSE);
procedure disable;
end debug;
/
create package body debug is
enabled boolean;
immediate boolean;
s integer;
linelength CONSTANT number := 255;
procedure put (msg in varchar2 default '') is
begin
if enabled and immediate then
if length(msg) <= linelength then
dbms_output.put_line(msg);
else
put(substr(msg, 1, linelength));
put(substr(msg, linelength+1));
end if;
elsif enabled then
if length(msg) <= linelength then
dbms_pipe.pack_message(msg);
dbms_pipe.pack_message(user);
dbms_pipe.pack_message(sysdate);
s := dbms_pipe.send_message('debugmsg', 300, 32768);
else
put(substr(msg, 1, linelength));
put(substr(msg, linelength+1));
end if;
end if;
end put;
procedure get is
msg varchar2(2000);
username varchar2(30);
prev_username varchar2(30);
when_put date;
prev_when date := to_date('01-JAN-1600', 'DD-MON-YYYY');
begin
if enabled then
s := dbms_pipe.receive_message('debugmsg', 0);
if s != 0 then
dbms_output.put_line('No debugging messages.');
end if;
while s = 0 loop
dbms_pipe.unpack_message(msg);
dbms_pipe.unpack_message(username);
dbms_pipe.unpack_message(when_put);
if username != prev_username or
trunc(when_put,'MI') != prev_when then
dbms_output.put_line('Put by ' || username || ' on ' ||
to_char(when_put, 'MM/DD/YY HH24:MI:SS'));
prev_username := username;
prev_when := trunc(when_put,'MI');
end if;
dbms_output.put_line(msg);
s := dbms_pipe.receive_message('debugmsg', 0);
end loop;
end if;
end get;
procedure enable (imm in boolean default FALSE) is
begin
enabled := TRUE;
immediate := imm;
dbms_output.enable(1000000);
end enable;
procedure disable is
begin
enabled := FALSE;
dbms_output.disable;
end disable;
begin
enabled := FALSE;
immediate := FALSE;
end debug;
/
--------------15A01C42FC0
Content-Type: text/plain; charset=us-ascii; name="Enable_imm.sql"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="Enable_imm.sql"
set serverout on
begin
debug.enable(TRUE);
end;
/
--------------15A01C42FC0
Content-Type: text/plain; charset=us-ascii; name="Enable.sql"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="Enable.sql"
set serverout on
begin
debug.enable;
debug.get;
end;
/
--------------15A01C42FC0--
Received on Mon Mar 10 1997 - 00:00:00 CST
![]() |
![]() |