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是担心长度不足出错
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;
/