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 異常處理...