| 導購 | 订阅 | 在线投稿
分享
 
 
 

後台運行一個主存儲過程,主存儲過程通過管道同前端過程通信的例子

來源:互聯網  2008-05-31 22:07:19  評論

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;

/

  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;      /
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有