beginmaxpro為提交主存儲過程起動的程序
maxpro 為主存儲過程
readmaxpro 為主存佳話
使用ORACLE中的DBMS_PIPE管道能力
注意要明文給於用戶 EXECUTE ANY PROCEDURE 權力才可以
在sqlpus用設定
set serveroutput ON 進行測試
通過 @testmaxpro
sql 創始程序包
測試過程如下
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_OUTPUT
PUT_LINE(
n=
|| n);
IF N=
THEN
DBMS_OUTPUT
PUT_LINE(
過程不可重入
);
RETURN;
END IF;
過程調用lock
UPDATE MYTEST SET MYSTATUS=
;
COMMIT;
通過DBMS_LOCK
SLEEP(
); 模擬大的處理過程
過程處理一段時間後就將一些信息放入管道
FOR N IN
LOOP
DBMS_PIPE
PURGE(
maxpro
);
清除原管道信息
DBMS_PIPE
PACK_MESSAGE(N);
把信息放入緩沖區
status:=DBMS_PIPE
SEND_MESSAGE(
maxpro
);
信息放入管道mypipe
系統等待時間為
秒
最大長度
DBMS_LOCK
SLEEP(
);
END LOOP;
過程調用unlock
DBMS_PIPE
PURGE(
maxpro
);
清除原管道信息
DBMS_PIPE
PACK_MESSAGE(
);
把信息放入緩沖區
表示過程完成
信息放入管道mypipe
系統等待時間為
秒
最大長度
原長度為
現在設為
是擔心長度不足出錯
status:=DBMS_PIPE
SEND_MESSAGE(
maxpro
);
UPDATE MYTEST SET MYSTATUS=
;
DBMS_OUTPUT
PUT_LINE(
過程處理完成
);
COMMIT;
P_NEXTDATE:=NULL;
END maxpro;
/
/*
對於maxpro存儲過程的狀態進行讀取的過程
主要使用讀取管道的方法
*/
CREATE OR REPLACE PROCEDURE readmaxpro AS
n integer;
status integer;
begin
接受等待時間為
秒
可以為
立即調用或DBMS_PIPE
RECEIVE_MESSAGE(
mypipe
) 等待
天
status:= DBMS_PIPE
RECEIVE_MESSAGE(
maxpro
);
status為
為成功可以UNPACK_MESSAGE
為超時沒有數據
為信息太大
為內部錯誤
IF status <>
THEN
SELECT mystatus INTO N FROM MYTEST;
IF N=
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+(
/(
*
*
))
TRUE);
DBMS_JOB
SUBMIT(JOB
maxpro;
sysdate
sysdate+(
/(
*
*
))
);
提交做業
秒後執行
注意設定實例ini文件中的job_queue_interval =
DBMS_JOB
SUBMIT(JOB
maxpro;
sysdate
NULL
FALSE);
DBMS_JOB
SUBMIT(JOB
maxpro;
sysdate+(
/(
*
*
))
NULL
FALSE);
DBMS_OUTPUT
PUT_LINE(
JOB=
|| JOB);
COMMIT;
end;
/
From:http://tw.wingwit.com/Article/program/Oracle/201311/16828.html