-- DBMS_EPG monitor
rem create and authorize dad as SCOTT
-- as SYS:
BEGIN
DBMS_EPG.create_dad
( dad_name => 'monitor'
, path => '/monitor/*'
);
END;
/
-- as SCOTT:
begin
DBMS_EPG.AUTHORIZE_DAD('monitor');
end;
/
create or replace
package pipe_monitor
as
procedure monitor
( p_pipename in varchar2
);
procedure retrieve_pipe_contents
( p_pipename in varchar2
);
end pipe_monitor;
create or replace
package body pipe_monitor
as
procedure write_background_refresh
( p_pipename in varchar2
) is
begin
htp.p('');
end;
procedure monitor
( p_pipename in varchar2
) as
begin
htp.p('
Monitor for Database Pipe ('||p_pipename||'');
write_background_refresh(p_pipename);
htp.p('');
htp.p('Monitoring Database Pipe '||p_pipename||'
');
htp.p('Most recent refresh time:
');
htp.p('');
-- htp.p('---');
htp.p('');
end;
procedure retrieve_pipe_contents
( p_pipename in varchar2
) as
inbound_status NUMBER;
message VARCHAR2(4000);
l_pipe_contents varchar2(30000);
l_first char(1):= 'Y';
begin
-- Listen for incoming messages on the pipe
loop
inbound_status := DBMS_PIPE.receive_message
( pipename => p_pipename
, timeout => 0
); -- do not wait for message; if there is none, continue;
-- Message received successfully.
IF inbound_status = 0
THEN
DBMS_PIPE.unpack_message(message);
l_pipe_contents:= message
||case l_first when 'Y' then '' else chr(13)||chr(10) end
||l_pipe_contents ; -- most recent comes first
l_first:='N';
else
exit;
END IF;
end loop;
htp.p(l_pipe_contents);
end retrieve_pipe_contents;
end pipe_monitor;
-- url on local XE:
http://127.0.0.1:8080/monitor/pipe_monitor.monitor?p_pipename=logging_pipe
-- other ports can be configured with
EXECUTE dbms_xdb.SETHTTPPORT(2100);
DECLARE
status NUMBER;
message VARCHAR2(80) := 'A message on the pipe';
pipe_name VARCHAR2(30) := 'logging_pipe';
BEGIN
DBMS_PIPE.pack_message(message);
status := DBMS_PIPE.send_message(pipe_name);
END;
-- run piece of PL/SQL that sends output to pipe
declare
cursor c_emp is select * from emp;
procedure log(msg in varchar2)
is
status NUMBER;
pipe_name VARCHAR2(30) := 'logging_pipe';
BEGIN
DBMS_PIPE.pack_message(msg);
status := DBMS_PIPE.send_message(pipe_name);
END;
begin
log('Anonymous block starts processing');
dbms_lock.sleep(2);
for r_emp in c_emp loop
log('Working on employee '||r_emp.ename);
dbms_lock.sleep(1);
end loop;
dbms_lock.sleep(2);
log('Done processing');
end;