自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Oracle存儲(chǔ)過程中異步調(diào)用的實(shí)際操作步驟

數(shù)據(jù)庫(kù) Oracle
以下的文章主要介紹的是Oracle存儲(chǔ)過程的相關(guān)異步調(diào)用的實(shí)際操作方案,其中也涵蓋了其基本原理的介紹,還有其具體實(shí)現(xiàn)測(cè)試等,相關(guān)內(nèi)容的描述。

我們都知道在Oracle數(shù)據(jù)庫(kù)的實(shí)際應(yīng)用的過程中,我們經(jīng)常把相關(guān)的業(yè)務(wù)處理邏輯,放在Oracle存儲(chǔ)過程中,客戶端以通過ADO來進(jìn)行相關(guān)的調(diào)用。而有些相關(guān)的業(yè)務(wù)邏輯處理量大并且復(fù)雜。

使客戶端調(diào)用存儲(chǔ)過程后,長(zhǎng)時(shí)間沒有反應(yīng),也不知Oracle存儲(chǔ)過程運(yùn)行狀態(tài),

本文講述如何在ORACLE通過任務(wù)和管道的應(yīng)用,異步調(diào)用存儲(chǔ)過程的方法。

 基本原理

1.使用DBMS_JOB包將主處理存儲(chǔ)過程作為任務(wù)提交到任務(wù)隊(duì)列中

2.主處理存儲(chǔ)過程在運(yùn)行過程中通過DBMS_PIPE包將處理情況放在管道中

3.監(jiān)控存儲(chǔ)過程讀取管道,從而了解處理情況

4.本文沒有描述雙向通信的方式,監(jiān)控Oracle存儲(chǔ)過程可以通過管道發(fā)送信息給主處理存儲(chǔ)過程

具體實(shí)現(xiàn)測(cè)試

建立測(cè)試環(huán)境

4.1. 對(duì)數(shù)據(jù)庫(kù)的ini進(jìn)行相關(guān)修改,使系統(tǒng)的任務(wù)隊(duì)列功能打開

對(duì)于Oracle9I,只需修設(shè)定數(shù)據(jù)庫(kù)的INI內(nèi)的"JOB_QUEUE_PROCESSES=非0值",如 "JOB_QUEUE_PROCESSES=10",對(duì)于Oracle8I除設(shè)定實(shí)例ini文件中的"JOB_QUEUE_PROCESSES=非0值"外,還需設(shè)定"job_queue_interval=1"

4.2. 設(shè)用用戶權(quán)限

由于使用Oracle中特定的程序包,所以要注意要明文給于用戶系統(tǒng)權(quán)限。對(duì)當(dāng)前用戶(測(cè)試用戶),賦于以下權(quán)力

  1. EXECUTE DBMS_PIPE  
  2. EXECUTE DBMS_LOCK  
  3. EXECUTE DBMS_JOB  

4.3. 建立模擬大業(yè)務(wù)處理存儲(chǔ)過程

本Oracle存儲(chǔ)過程通過循環(huán)30次,調(diào)用DBMS_LOCK.SLEEP(1)(體眠1秒)和寫管道模擬大的處理過程。

具體代碼如下:

 

 

  1. CREATE OR REPLACE PROCEDURE maxpro AS  
  2. n integer;   
  3. status NUMBER;  
  4. BEGIN  
  5. FOR N IN 1..30 LOOP 

 

 

DBMS_PIPE.PURGE('maxpro'); 清除原管道信息

 

DBMS_PIPE.PACK_MESSAGE(N); 把信息放入緩沖區(qū)

 

status:=DBMS_PIPE.SEND_MESSAGE('maxpro');

 

DBMS_LOCK.SLEEP(1);

 

END LOOP;

 

DBMS_PIPE.PURGE('maxpro'); 清除原管道信息

 

DBMS_PIPE.PACK_MESSAGE(999999); 把信息放入緩沖區(qū),用999999 表示過程完成

 

status:=DBMS_PIPE.SEND_MESSAGE('maxpro');

 

END maxpro;

 

4.4. 建立讀取管道動(dòng)態(tài)了解處理狀態(tài)的Oracle存儲(chǔ)過程

以下代碼是對(duì)于maxpro存儲(chǔ)過程的狀態(tài)進(jìn)行讀取的過程,主要使用讀取管道的方法,注意:

 

  1. status:DBMS_PIPE.RECEIVE_MESSAGE('maxpro',0);  

中的"0"參數(shù)是很關(guān)鍵的,說明接受等待時(shí)間為0秒,表示,調(diào)用時(shí)如果沒有信息不等待直接返回。

具體代碼如下:

 

  1. CREATE OR REPLACE PROCEDURE readmaxpro AS  
  2. n integer;  
  3. status integer;  
  4. begin 

 

接受等待時(shí)間為1秒,可以為0,立即調(diào)用或DBMS_PIPE.RECEIVE_MESSAGE('mypipe') 等待100天

 

status:= DBMS_PIPE.RECEIVE_MESSAGE('maxpro',0);

 

status為0為成功可以UNPACK_MESSAGE,1為超時(shí)沒有數(shù)據(jù),2為信息太大,3為內(nèi)部錯(cuò)誤

 

  1. IF status <> 0 THEN  
  2. DBMS_OUTPUT.PUT_LINE('管道中現(xiàn)在沒有信息返回');  
  3. return;  
  4. END IF;  
  5. DBMS_PIPE.UNPACK_MESSAGE(n);  
  6. DBMS_OUTPUT.PUT_LINE('maxpro 的當(dāng)前進(jìn)行狀態(tài)為'|| n);  
  7. end;  

4.5. -起動(dòng)模擬大業(yè)務(wù)處理Oracle存儲(chǔ)過程為后臺(tái)進(jìn)程的存儲(chǔ)過程(BEGINMAXPRO)

通過DBMS_JOB.SUBMIT(JOB,'maxpro;',sysdate,NULL,FALSE);使"maxpro"為一個(gè)任務(wù),在當(dāng)前時(shí)間(sysdate)后執(zhí)行,當(dāng)然如果把sysdate改一具體時(shí)間,那就在具體時(shí)間執(zhí)行

具休代碼如下:

  1. CREATE OR REPLACE PROCEDURE beginmaxpro AS  
  2. JOB BINARY_INTEGER;  
  3. BEGIN  
  4. DBMS_JOB.SUBMIT(JOB,'maxpro;',sysdate,NULL,FALSE);  
  5. DBMS_OUTPUT.PUT_LINE('隊(duì)列號(hào)碼JOB=' || JOB);  
  6. COMMIT;  
  7. end;  

代碼執(zhí)行

5.1. 執(zhí)行過程

 

注:黑體字是屏幕輸出,下劃線字是輸入內(nèi)容

 

在CMD行輸入 sqlplus 根據(jù)提示登錄

 

設(shè)定DBMS_OUTPUT可見

 

SQL> set serveroutput ON

 

以下是執(zhí)行過程和相應(yīng)的返回信息

 

SQL> call beginmaxpro();

 

隊(duì)列號(hào)碼JOB=21

 

調(diào)用完成。

 

SQL> call readmaxpro();

 

maxpro 的當(dāng)前進(jìn)行狀態(tài)為14

 

調(diào)用完成。

 

SQL> call readmaxpro();

 

maxpro 的當(dāng)前進(jìn)行狀態(tài)為16

 

調(diào)用完成。

 

SQL> call readmaxpro();

 

maxpro 的當(dāng)前進(jìn)行狀態(tài)為23

 

調(diào)用完成。

 

SQL> call readmaxpro();

 

maxpro 的當(dāng)前進(jìn)行狀態(tài)為999999

 

調(diào)用完成。

 

SQL> call readmaxpro();

 

管道中現(xiàn)在沒有信息返回

 

調(diào)用完成。

 

SQL>

 

5.2. 執(zhí)行分析

beginmaxpro(),將主處理存儲(chǔ)過程放入隊(duì)列的過程,執(zhí)行后存儲(chǔ)程序馬上返回,maxpro存儲(chǔ)過程放在任務(wù)隊(duì)列中,并設(shè)定為在當(dāng)前系統(tǒng)時(shí)間執(zhí)行(馬上執(zhí)行)

maxpro為主處理存儲(chǔ)過程,開始執(zhí)行模擬大業(yè)務(wù)處理,處理過程中將處理進(jìn)度信息寫入管道

readmaxpro();為檢查狀態(tài)Oracle存儲(chǔ)過程,首先讀取信息,如果信息不存在,說明管道內(nèi)沒有信息可讀而退出;如果存在信息則讀出信息

本例子可以進(jìn)行改進(jìn),輸出不通過DBMS_OUTPUT.PUT_LINE而是用返回值,那么就可以在前端用ADO調(diào)用,發(fā)布任務(wù),任務(wù)過程中從客戶端讀取進(jìn)度。代碼如下:

 

  1. CREATE OR REPLACE PROCEDURE readmaxpro(p out intergr) AS  
  2. n integer;  
  3. status integer;  
  4. begin  
  5. status:DBMS_PIPE.RECEIVE_MESSAGE('maxpro',0);  
  6. IF status <> 0 THEN  
  7. P:=-1;  
  8. return;  
  9. END IF;  
  10. DBMS_PIPE.UNPACK_MESSAGE(p);  
  11. end;  

6. 附錄:

6.1. 相關(guān)程序包說明

 

1

 

 

  1. DBMS_JOB.SUBMIT(  
  2. JOB OUT BINARY_INTEGER,  
  3. WHAT IN VARCHAR2,  
  4. NEXT_DATE IN DATE DEFAULTSYSDATE,   
  5. INTERVAL IN VARCHAR2 DEFAULT 'NULL',  
  6. NO_PARSE IN BOOLEAN DEFAULT FALSE,  
  7. INSTANCE IN BINARY_INTEGER DEFAULT ANY_INSTANCE,  
  8. FORCE IN BOOLEAN DEFAULT FALSE) 

 

功能:提交作業(yè)入作業(yè)隊(duì)列

 

參數(shù)說明:

 

JOB:作業(yè)的作業(yè)號(hào),輸出參數(shù)

 

WHAT:作業(yè)對(duì)應(yīng)的PL/SQL代碼(一般用于過程名)

 

NEXT_DATE:下一次作業(yè)運(yùn)行的時(shí)間

 

INTERVAL:作業(yè)執(zhí)行間隔時(shí)間,缺省是NULL,只執(zhí)行一次

 

NO_PARSE:是否對(duì)WHAT語句,在提交時(shí)進(jìn)行分析,缺省是進(jìn)行分析。

 

INSTANCE:作業(yè)提交時(shí),指明運(yùn)行作業(yè)的實(shí)例,缺省是0,任何的數(shù)據(jù)庫(kù)全可以

 

FORCE:是否檢查INSTANCE指定的數(shù)據(jù)庫(kù)在運(yùn)行,缺省是FALSE,不檢查

 

例子:

 

  1. declare  
  2. jobn number;  
  3. begin  
  4. DBMS_JOB.SUBMIT(jobn,'maxpro;',sysdate);  
  5. DBMS_OUTPUT.PUT_LINE('JOB=' || jobn);  
  6. COMMIT;  
  7. end;  

注意:

設(shè)定數(shù)據(jù)庫(kù)參數(shù)JOB_QUEUE_PROCESSES = 非0值(***隊(duì)列數(shù)***60)

對(duì)于9I前設(shè)定數(shù)據(jù)庫(kù)參數(shù)JOB_QUEUE_INTERVAL = 非0值(隊(duì)列掃描周期1-3600秒)

2

  1. DBMS_PIPE.PACK_MESSAGE (item IN VARCHAR2);  
  2. DBMS_PIPE.PACK_MESSAGE (item IN NCHAR);  
  3. DBMS_PIPE.PACK_MESSAGE (item IN NUMBER);  
  4. DBMS_PIPE.PACK_MESSAGE (item IN DATE);  
  5. DBMS_PIPE.PACK_MESSAGE_RAW (item IN RAW);  
  6. DBMS_PIPE.PACK_MESSAGE_ROWID (item IN ROWID); 

功能:把一個(gè)數(shù)據(jù)項(xiàng)放到私有數(shù)據(jù)緩沖區(qū)

3

  1. DBMS_PIPE.SEND_MESSAGE (  
  2. pipename IN VARCHAR2,  
  3. timeout IN INTEGER DEFAULT MAXWAIT,  
  4. maxpipesize IN INTEGER DEFAULT 8192)  
  5. RETURN INTEGER; 

 

功能:發(fā)送私有數(shù)據(jù)緩沖區(qū)的信息到命名管道,如果管道不存在就建立

4

  1. DBMS_PIPE.RECEIVE_MESSAGE (  
  2. pipename IN VARCHAR2,  
  3. timeout IN INTEGER DEFAULT maxwait) RETURN INTEGER; 

功能:從管道到接受信息放到數(shù)據(jù)緩沖區(qū)

5

  1. DBMS_PIPE.UNPACK_MESSAGE (item OUT VARCHAR2);  
  2. DBMS_PIPE.UNPACK_MESSAGE (item OUT NCHAR);  
  3. DBMS_PIPE.UNPACK_MESSAGE (item OUT NUMBER);  
  4. DBMS_PIPE.UNPACK_MESSAGE (item OUT DATE);  
  5. DBMS_PIPE.UNPACK_MESSAGE_RAW (item OUT RAW);  
  6. DBMS_PIPE.UNPACK_MESSAGE_ROWID (item OUT ROWID); 

功能:從數(shù)據(jù)緩沖區(qū)接收下一個(gè)數(shù)據(jù)項(xiàng)

6

  1. DBMS_PIPE.PURGE ( pipename IN VARCHAR2); 

功能:清除管道內(nèi)的信息

 

以上的相關(guān)內(nèi)容就是對(duì)Oracle存儲(chǔ)過程的異步調(diào)用 的介紹,望你能有所收獲。

 

文章出自: http://wolongshan.javaeye.com/blog/638734

【編輯推薦】

  1. Oracle遠(yuǎn)程復(fù)制和異地容災(zāi)的3種解決方案介紹
  2. Oracle數(shù)據(jù)庫(kù)保持其優(yōu)良性的手段有哪些
  3. 九大Oracle性能優(yōu)化基本方法詳解
  4. Oracle數(shù)據(jù)庫(kù)的四種實(shí)用性很強(qiáng)的啟動(dòng)方式
  5. Oracle 11g中***有獨(dú)特點(diǎn)的5大特點(diǎn)
責(zé)任編輯:佚名 來源: javaeye
相關(guān)推薦

2010-04-07 13:02:14

Oracle 存儲(chǔ)過程

2010-07-23 14:26:37

SQL Server存

2010-03-30 12:50:42

Oracle存儲(chǔ)

2010-04-27 15:11:20

Oracle樹的存儲(chǔ)過

2010-04-20 11:06:33

Oracle索引

2010-04-02 13:34:33

Oracle DBA

2010-04-06 08:58:27

Oracle job

2010-04-15 14:30:35

Oracle創(chuàng)建

2010-08-05 14:34:26

DB2存儲(chǔ)過程

2010-04-15 13:51:06

Oracle EBS

2010-04-21 17:09:17

Oracle安裝

2010-05-26 14:55:43

MySQL存儲(chǔ)過程

2010-04-21 17:51:36

Oracle左連接

2010-03-12 15:29:19

Pythonexe

2010-05-10 18:05:15

Oracle釋放und

2010-04-21 10:23:13

Oracle實(shí)現(xiàn)

2010-03-16 15:16:01

Python web框

2010-04-30 14:39:03

Oracle數(shù)據(jù)庫(kù)

2010-03-31 15:23:43

Oracle數(shù)據(jù)庫(kù)軟件

2010-04-01 17:56:59

Oracle客戶端配置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)