萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> oracle教程 >> Oracle存儲過程中任務和管道的應用

Oracle存儲過程中任務和管道的應用

1. 前言

在Oracle數據庫實際應用過程中,經常把業務處理邏輯的放在存儲過程,客戶端通過ADO進行調用。有些業務邏輯處理量大並且復雜,使客戶端調用存儲過程後,長時間沒有反應,也不知存儲過程運行狀態,本文講述如何在Oracle通過任務和管道的應用,異步調用存儲過程的方法。

2. 基本原理

1.使用DBMS_JOB包將主處理存儲過程作為任務提交到任務隊列中;

2.主處理存儲過程在運行過程中通過DBMS_PIPE包將處理情況放在管道中;

3.監控存儲過程讀取管道,從而了解處理情況;

4.本文沒有描述雙向通信的方式,監控存儲過程可以通過管道發送信息給主處理存儲過程。

3. 具體實現測試

建立測試環境

3.1. 對數據庫的ini進行相關修改,使系統的任務隊列功能打開

對於Oracle9I,只需修設定數據庫的INI內的"JOB_QUEUE_PROCESSES=非0值",如 "JOB_QUEUE_PROCESSES=10",對於Oracle8I除設定實例ini文件中的"JOB_QUEUE_PROCESSES=非0值"外,還需設定"job_queue_interval=1"。

3.2. 設用用戶權限

由於使用Oracle中特定的程序包,所以要注意要明文給於用戶系統權限。對當前用戶(測試用戶),賦於以下權力:  EXECUTE DBMS_PIPE
  EXECUTE DBMS_LOCK
  EXECUTE DBMS_JOB

3.3. 建立模擬大業務處理存儲過程

本存儲過程通過循環30次,調用DBMS_LOCK.SLEEP(1)(體眠1秒)和寫管道模擬大的處理過程。

具體代碼如下:  CREATE OR REPLACE PROCEDURE maxpro AS
  n integer;
  status NUMBER;
  BEGIN
  FOR N IN 1..30 LOOP
  DBMS_PIPE.PURGE('maxpro'); --清除原管道信息
  DBMS_PIPE.PACK_MESSAGE(N); --把信息放入緩沖區
  status:=DBMS_PIPE.SEND_MESSAGE('maxpro');
  DBMS_LOCK.SLEEP(1);
  END LOOP;
  DBMS_PIPE.PURGE('maxpro'); --清除原管道信息
  DBMS_PIPE.PACK_MESSAGE(999999); --把信息放入緩沖區,用999999 表示過程完成
  status:=DBMS_PIPE.SEND_MESSAGE('maxpro');
  END maxpro;

  • 共3頁:
  • 上一頁
  • 1
  • 2
  • 3
  • 下一頁
copyright © 萬盛學電腦網 all rights reserved