--接受等待时间为1秒,可以为0,立即调用或DBMS_PIPE.
RECEIVE_MESSAGE(mypipe) 等待100天
status:= DBMS_PIPE.RECEIVE_MESSAGE(maxpro,0);
--status为0为成功可以UNPACK_MESSAGE,1为超时没有数据,2为信息太大,3为内部错误
IF status <> 0 THEN
DBMS_OUTPUT.PUT_LINE(管道中现在没有信息返回);
return;
END IF;
DBMS_PIPE.UNPACK_MESSAGE(n);
DBMS_OUTPUT.PUT_LINE(maxpro 的当前进行状态为|| n);
end;
5. -起动模拟大业务处理存储过程为后台进程的存储过程(BEGINMAXPRO)。通过DBMS_JOB.SUBMIT(JOB,maxpro;,sysdate,NULL,FALSE);使"maxpro"为一个任务,在当前时间(sysdate)后执行,当然如果把sysdate改一具体时间,那就在具体时间执行
具休代码如下:
CREATE OR REPLACE PROCEDURE beginmaxpro AS
JOB BINARY_INTEGER;
BEGIN
DBMS_JOB.SUBMIT(JOB,maxpro;,sysdate,NULL,FALSE);
DBMS_OUTPUT.PUT_LINE(队列号码JOB= || JOB);
COMMIT;
end;
代码执行
1. 执行过程
在CMD行输入 sqlplus 根据提示登录
设定DBMS_OUTPUT可见
SQL> set serveroutput ON
以下是执行过程和相应的返回信息
SQL> call beginmaxpro();
队列号码JOB=21
调用完成。
SQL> call readmaxpro();
maxpro 的当前进行状态为14
调用完成。
SQL> call readmaxpro();
maxpro 的当前进行状态为16
调用完成。
SQL> call readmaxpro();
maxpro 的当前进行状态为23
调用完成。
SQL> call readmaxpro();
maxpro 的当前进行状态为999999
调用完成。
SQL> call readmaxpro();
管道中现在没有信息返回
调用完成。
SQL>
2. 执行分析
beginmaxpro(),将主处理存储过程放入队列的过程,执行后存储程序马上返回,maxpro存储过程放在任务队列中,并设定为在当前系统时间执行(马上执行)。
maxpro为主处理存储过程,开始执行模拟大业务处理,处理过程中将处理进度信息写入管道。
readmaxpro();为检查状态存储过程,首先读取信息,如果信息不存在,说明管道内没有信息可读而退出;如果存在信息则读出信息。
本例子可以进行改进,输出不通过DBMS_OUTPUT.PUT_LINE而是用返回值,那么就可以在前端用ADO调用,发布任务,任务过程中从客户端读取进度。代码如下:CREATE OR REPLACE PROCEDURE readmaxpro(p out intergr) AS
n integer;
status integer;
begin
status:= DBMS_PIPE.RECEIVE_MESSAGE(maxpro,0);
IF status <> 0 THEN
P:=-1;
return;
END IF;
DBMS_PIPE.UNPACK_MESSAGE(p);
end;