3.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;
4. 附录:
4.1. 相关程序包说明
DBMS_JOB.SUBMIT(
JOB OUT BINARY_INTEGER,
WHAT IN VARCHAR2,
NEXT_DATE IN DATE DEFAULTSYSDATE,
INTERVAL IN VARCHAR2 DEFAULT 'NULL',
NO_PARSE IN BOOLEAN DEFAULT FALSE,
INSTANCE IN BINARY_INTEGER DEFAULT ANY_INSTANCE,
FORCE IN BOOLEAN DEFAULT FALSE)
功能:提交作业入作业队列
参数说明:
JOB:作业的作业号,输出参数
WHAT:作业对应的PL/SQL代码(一般用于过程名)
NEXT_DATE:下一次作业运行的时间
INTERVAL:作业执行间隔时间,缺省是NULL,只执行一次
NO_PARSE:是否对WHAT语句,在提交时进行分析,缺省是进行分析。
INSTANCE:作业提交时,指明运行作业的实例,缺省是0,任何的数据库全可以
FORCE:是否检查INSTANCE指定的数据库在运行,缺省是FALSE,不检查
例子:
declare
jobn number;
begin
DBMS_JOB.SUBMIT(jobn,'maxpro;',sysdate);
DBMS_OUTPUT.PUT_LINE('JOB=' || jobn);
COMMIT;
end;
注意:
设定数据库参数JOB_QUEUE_PROCESSES = 非0值(最大队列数最大60)
对于9I前设定数据库参数JOB_QUEUE_INTERVAL = 非0值(队列扫描周期1-3600秒)
4.2
DBMS_PIPE.PACK_MESSAGE (item IN VARCHAR2);
DBMS_PIPE.PACK_MESSAGE (item IN NCHAR);
DBMS_PIPE.PACK_MESSAGE (item IN NUMBER);
DBMS_PIPE.PACK_MESSAGE (item IN DATE);
DBMS_PIPE.PACK_MESSAGE_RAW (item IN RAW);
DBMS_PIPE.PACK_MESSAGE_ROWID (item IN ROWID);
功能:把一个数据项放到私有数据缓冲区
4.3
DBMS_PIPE.SEND_MESSAGE (
pipename IN VARCHAR2,
timeout IN INTEGER DEFAULT MAXWAIT,
maxpipesize IN INTEGER DEFAULT 8192)
RETURN INTEGER;
功能:发送私有数据缓冲区的信息到命名管道,如果管道不存在就建立
4.4
DBMS_PIPE.RECEIVE_MESSAGE (
pipename IN VARCHAR2,
timeout IN INTEGER DEFAULT maxwait) RETURN INTEGER;
功能:从管道到接受信息放到数据缓冲区
4.5
DBMS_PIPE.UNPACK_MESSAGE (item OUT VARCHAR2);
DBMS_PIPE.UNPACK_MESSAGE (item OUT NCHAR);
DBMS_PIPE.UNPACK_MESSAGE (item OUT NUMBER);
DBMS_PIPE.UNPACK_MESSAGE (item OUT DATE);
DBMS_PIPE.UNPACK_MESSAGE_RAW (item OUT RAW);
DBMS_PIPE.UNPACK_MESSAGE_ROWID (item OUT ROWID);
功能:从数据缓冲区接收下一个数据项
4.6
DBMS_PIPE.PURGE ( pipename IN VARCHAR2);
功能:清除管道内的信息
