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