技术开发 频道

ORACLE的存储过程的异步调用

    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);

    功能:清除管道内的信息
   

0
相关文章