电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

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


发布日期:2018/7/26
 

beginmaxpro为提交主存储过程起动的程序

maxpro 为主存储过程

readmaxpro 为主存佳话

使用ORACLE中的DBMS_PIPE管道能力注意要明文给于用户 EXECUTE ANY PROCEDURE 权力才可以

在sqlpus用设定

set serveroutput ON 进行测试

通过 @testmaxprosql 创始程序包

测试过程如下

SQL> call beginmaxpro();

JOB=

调用完成

SQL> call readmaxpro();

maxpro 的当前进行状态为

调用完成

SQL>

*/

建立状态表

create table mytest(mystatus integer);

delete from mytest;

INSERT INTO MYTEST(MYSTATUS) VALUES();

commit;

/

不可重用的存储过程并且处理过程通过管道给ORACEL内的存储过程通信

使用ORACLE中的DBMS_PIPE管道能力注意要明文给于用户 EXECUTE ANY PROCEDURE 权力才可以

首先 create table mytest(mystatus integer);

INSERT INTO MYTEST(MYSTATUS) VALUES();

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_OUTPUTPUT_LINE(n= || n);

IF N= THEN

DBMS_OUTPUTPUT_LINE(过程不可重入);

RETURN;

END IF;

过程调用lock

UPDATE MYTEST SET MYSTATUS=;

COMMIT;

通过DBMS_LOCKSLEEP(); 模拟大的处理过程过程处理一段时间后就将一些信息放入管道

FOR N IN LOOP

DBMS_PIPEPURGE(maxpro); 清除原管道信息

DBMS_PIPEPACK_MESSAGE(N); 把信息放入缓沖区

status:=DBMS_PIPESEND_MESSAGE(maxpro); 信息放入管道mypipe系统等待时间为最大长度

DBMS_LOCKSLEEP();

END LOOP;

过程调用unlock

DBMS_PIPEPURGE(maxpro); 清除原管道信息

DBMS_PIPEPACK_MESSAGE(); 把信息放入缓沖区 表示过程完成

信息放入管道mypipe系统等待时间为最大长度

原长度为现在设为是担心长度不足出错

status:=DBMS_PIPESEND_MESSAGE(maxpro);

UPDATE MYTEST SET MYSTATUS=;

DBMS_OUTPUTPUT_LINE(过程处理完成);

COMMIT;

P_NEXTDATE:=NULL;

END maxpro;

/

/*

对于maxpro存储过程的状态进行读取的过程主要使用读取管道的方法

*/

CREATE OR REPLACE PROCEDURE readmaxpro AS

n integer;

status integer;

begin

接受等待时间为可以为立即调用或DBMS_PIPERECEIVE_MESSAGE(mypipe) 等待

status:= DBMS_PIPERECEIVE_MESSAGE(maxpro);

status为为成功可以UNPACK_MESSAGE为超时没有数据为信息太大为内部错误

IF status <> THEN

SELECT mystatus INTO N FROM MYTEST;

IF N= THEN

DBMS_OUTPUTPUT_LINE(maxpro 过程没有起动);

ELSE

DBMS_OUTPUTPUT_LINE(maxpro 过程起动但管道中现在没有信息返回);

END IF;

return;

END IF;

DBMS_PIPEUNPACK_MESSAGE(n);

DBMS_OUTPUTPUT_LINE(maxpro 的当前进行状态为|| n);

end;

起动maxpro为后台进程的存储过程

/

CREATE OR REPLACE PROCEDURE beginmaxpro AS

JOB BINARY_INTEGER;

BEGIN

DBMS_JOBSUBMIT(JOBmaxpro;sysdatesysdate+(/(**))TRUE);

DBMS_JOBSUBMIT(JOBmaxpro;sysdatesysdate+(/(**)));

提交做业秒后执行注意设定实例ini文件中的job_queue_interval =

DBMS_JOBSUBMIT(JOBmaxpro;sysdateNULLFALSE);

DBMS_JOBSUBMIT(JOBmaxpro;sysdate+(/(**))NULLFALSE);

DBMS_OUTPUTPUT_LINE(JOB= || JOB);

COMMIT;

end;

/

上一篇:充分利用自动撤销管理的优点

下一篇:在存储过程中做简单动态查询代码