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