后台运行一个主存储过程,主存储过程通过管道同前端过程通信

  • 来源: 互联网 作者: rocket   2008-03-19/14:40
  • beginmaxpro为提交主存储过程起动的程序
    maxpro 为主存储过程
    readmaxpro 为主存佳话
    使用ORACLE中的DBMS_PIPE管道能力,注意要明文给于用户 EXECUTE ANY PROCEDURE 权力才可以
    在sqlpus用设定
    set serveroutput ON 进行测试
    通过 @testmaxpro.sql 创始程序包
    测试过程如下
    SQL> call beginmaxpro();
    JOB=62
    调用完成。
    SQL> call readmaxpro();
    maxpro 的当前进行状态为9
    调用完成。
    SQL>

    */
    --建立状态表
    create table mytest(mystatus integer);
    delete from mytest;
    INSERT INTO MYTEST(MYSTATUS) VALUES(0);
    commit;

    /
    --不可重用的存储过程,并且处理过程通过管道给ORACEL内的存储过程通信
    --使用ORACLE中的DBMS_PIPE管道能力,注意要明文给于用户 EXECUTE ANY PROCEDURE 权力才可以
    --首先 create table mytest(mystatus integer);
    -- INSERT INTO MYTEST(MYSTATUS) VALUES(0);
    --CREATE OR REPLACE PROCEDURE maxpro(P_NEXTDATE IN OUT DATE) AS
    CREATE OR REPLACE PROCEDURE maxpro AS

    n integer;
    status NUMBER;
    BEGIN
    --取当前状态
    SELECT mystatus INTO N FROM MYTEST;
    -- DBMS_OUTPUT.PUT_LINE('n=' || n);

    IF N=1 THEN
    DBMS_OUTPUT.PUT_LINE('过程不可重入');
    RETURN;
    END IF;
    --过程调用lock
    UPDATE MYTEST SET MYSTATUS=1;
    COMMIT;
    --通过DBMS_LOCK.SLEEP(1); 模拟大的处理过程,过程处理一段时间后就将一些信息放入管道
    FOR N IN 1..30 LOOP
    DBMS_PIPE.PURGE('maxpro'); --清除原管道信息
    DBMS_PIPE.PACK_MESSAGE(N); --把信息放入缓冲区
    status:=DBMS_PIPE.SEND_MESSAGE('maxpro',1,100); --信息放入管道mypipe,系统等待时间为1秒,最大长度10000
    DBMS_LOCK.SLEEP(1);
    END LOOP;


    --过程调用unlock
    DBMS_PIPE.PURGE('maxpro'); --清除原管道信息
    DBMS_PIPE.PACK_MESSAGE(999999); --把信息放入缓冲区,999999 表示过程完成
    --信息放入管道mypipe,系统等待时间为1秒,最大长度110
    --原长度为100,现在设为110是担心长度不足出错 BBS.bitsCN.com网管论坛
    status:=DBMS_PIPE.SEND_MESSAGE('maxpro',1,110);

    UPDATE MYTEST SET MYSTATUS=0;
    DBMS_OUTPUT.PUT_LINE('过程处理完成');
    COMMIT;
    --P_NEXTDATE:=NULL;
    END maxpro;
    /

    /*
    对于maxpro存储过程的状态进行读取的过程,主要使用读取管道的方法
    */
    CREATE OR REPLACE PROCEDURE readmaxpro AS
    n integer;
    status integer;
    begin

    --接受等待时间为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
    SELECT mystatus INTO N FROM MYTEST;
    IF N=0 THEN
    DBMS_OUTPUT.PUT_LINE('maxpro 过程没有起动');
    ELSE
    DBMS_OUTPUT.PUT_LINE('maxpro 过程起动,但管道中现在没有信息返回');
    END IF;
    return;
    END IF;

    DBMS_PIPE.UNPACK_MESSAGE(n);
    DBMS_OUTPUT.PUT_LINE('maxpro 的当前进行状态为'|| n);
    end;

    --起动maxpro为后台进程的存储过程
    /
    CREATE OR REPLACE PROCEDURE beginmaxpro AS
    JOB BINARY_INTEGER;
    BEGIN
    -- DBMS_JOB.SUBMIT(JOB,'maxpro;',sysdate,'sysdate+(5/(24*60*60))',TRUE);
    -- DBMS_JOB.SUBMIT(JOB,'maxpro;',sysdate,'sysdate+(60/(24*60*60))');
    --提交做业1秒后执行,注意设定实例ini文件中的job_queue_interval = 1
    DBMS_JOB.SUBMIT(JOB,'maxpro;',sysdate,NULL,FALSE);
    --DBMS_JOB.SUBMIT(JOB,'maxpro;',sysdate+(1/(24*60*60)),NULL,FALSE);
    DBMS_OUTPUT.PUT_LINE('JOB=' || JOB);
    COMMIT;
    end;

    /


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多