熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

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

2013-11-13 15:30:23  來源: Oracle 

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

From:http://tw.wingwit.com/Article/program/Oracle/201311/16828.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.