国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 02:38:46
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄂伦春自治旗| 休宁县| 陆河县| 双桥区| 新郑市| 白水县| 祁东县| 建德市| 西乌珠穆沁旗| 延边| 晋宁县| 易门县| 顺义区| 广安市| 古丈县| 通许县| 岢岚县| 鄂托克旗| 仙居县| 廊坊市| 灵石县| 平乐县| 十堰市| 苍南县| 桃园市| 兴山县| 马山县| 英吉沙县| 临夏市| 原平市| 北辰区| 古田县| 兴和县| 陕西省| 曲水县| 黑河市| 江油市| 鄯善县| 健康| 义乌市| 康乐县|