Oracle資料庫中儲存過程的非同步呼叫

2021-06-15 20:51:45 字數 3709 閱讀 3290

oracle資料庫中儲存過程的非同步呼叫

基本原理

1.使用dbms_job包將主處理儲存過程作為任務提交到任務佇列中。 2.

主處理儲存過程在執行過程中通過dbms_pipe包將處理情況放在管道中。 3.

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

本文沒有描述雙向通訊的方式,監控儲存過程可以通過管道傳送資訊給主處理儲存過程。

具體實現測試

建立測試環境

1. 對資料庫的ini進行相關修改,使系統的任務佇列功能開啟。對於oracle9i,只需修設定資料庫的ini內的"job_queue_processes=非0值",如 "job_queue_processes=10",對於oracle8i除設定例項ini檔案中的"job_queue_processes=非0值"外,還需設定"job_queue_interval=1"。

2. 設用使用者許可權

由於使用oracle中特定的程式包,所以要注意要明文給於使用者系統許可權。對當前使用者(測試使用者),賦於以下權力

execute dbms_pipe

execute dbms_lock

execute dbms_job

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;

4. 建立讀取管道動態了解處理狀態的儲存過程

以下**是對於maxpro儲存過程的狀態進行讀取的過程,主要使用讀取管道的方法,注意:status:= dbms_pipe.receive_message('maxpro',0);中的"0"引數是很關鍵的,說明接受等待時間為0秒,表示,呼叫時如果沒有資訊不等待直接返回。

具體**如下:

create or replace procedure readmaxproas

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

dbms_output.put_line('

管道中現在沒有資訊返回');

return;

end if;

dbms_pipe.unpack_message(n);

dbms_output.put_line('maxpro

的當前進行狀態為'|| n);

end;

5. -

起動模擬大業務處理儲存過程為後台程序的儲存過程(beginmaxpro)。通過dbms_job.submit(job,'maxpro;',sysdate,null,false);使"maxpro"為乙個任務,在當前時間(sysdate)後執行,當然如果把sysdate改一具體時間,那就在具體時間執行

具休**如下:

create or replace procedure beginmaxpro as

job binary_integer;

begin

dbms_job.submit(job,'maxpro;',sysdate,null,false);

dbms_output.put_line('

佇列號碼job=' || job);

commit;

end;

**執行

1. 執行過程

在cmd行輸入 sqlplus 根據提示登入

設定dbms_output可見

sql> set serveroutput on

以下是執行過程和相應的返回資訊

sql> call beginmaxpro();

佇列號碼job=21

呼叫完成。

sql> call readmaxpro();

maxpro

的當前進行狀態為14

呼叫完成。

sql> call readmaxpro();

maxpro

的當前進行狀態為16

呼叫完成。

sql> call readmaxpro();

maxpro

的當前進行狀態為23

呼叫完成。

sql> call readmaxpro();

maxpro

的當前進行狀態為999999

呼叫完成。

sql> call readmaxpro();

管道中現在沒有資訊返回

呼叫完成。

sql>

2. 執行分析

beginmaxpro()

,將主處理儲存過程放入佇列的過程,執行後儲存程式馬上返回,maxpro儲存過程放在任務佇列中,並設定為在當前系統時間執行(馬上執行)。

maxpro

為主處理儲存過程,開始執行模擬大業務處理,處理過程中將處理進度資訊寫入管道。

readmaxpro();

為檢查狀態儲存過程,首先讀取資訊,如果資訊不存在,說明管道內沒有資訊可讀而退出;如果存在資訊則讀出資訊。

本例子可以進行改進,輸出不通過dbms_output.put_line而是用返回值,那麼就可以在前端用ado呼叫,發布任務,任務過程中從客戶端讀取進度。**如下:

create or replace procedure readmaxpro(p out intergr)as

n integer;

status integer;

begin

status:= dbms_pipe.receive_message('maxpro',0);

if status <> 0 then

p:=-1;

return;

end if;

dbms_pipe.unpack_message(p);

end;

(

資料庫中儲存過程意義

建立了是拿來用的,至於為什麼要用儲存過程,要先了解儲存過程存在的意義 儲存過程由 sql語句 和流程控制 語句組成。它的功能包括 接受引數 呼叫另一過程 返回乙個狀態值給呼叫過程或批處理,指示呼叫成功或失敗 返回若干個引數值給呼叫過程或批處理,為呼叫者提供動態結果 在遠端sql server中執行等...

資料庫中儲存過程的除錯

一.除錯sql server 2000 1.設定帳戶。1 在windows服務中找到mssqlserver,雙擊彈出對話方塊。2 選擇 登陸 選項卡,選中 此帳戶 輸入乙個管理員帳戶和密碼。3 重啟服務。2.在查詢分析器執行單步除錯。1 在查詢分析器中,右鍵單擊儲存過程,選擇 除錯 二.vs2005...

Oracle中儲存過程

1 建立乙個儲存過程 create or replace procedure pro name parameter1 parameter2 is as begin plsql sentences pl sql語句,儲存過程功能實現的主體 exception dowith sentences 異常處理...