1. 程式人生 > 實用技巧 >oracle利用job實現儲存過程非同步執行

oracle利用job實現儲存過程非同步執行

1.背景

在實際開發中,我們可能會利用儲存過程批量處理業務,

對應有些儲存過程可能會執行很長時間,這時我們需要客戶端點操作後,儲存過程非同步執行

具體實現如下

1.建立處理業務的儲存過程:sp_test_handle

2.建立觸發業務的job:TEST_HANDLE_JOBS

3.建立客戶端呼叫的儲存過程:sp_test_handle_run

4.客戶端呼叫儲存過程sp_test_handle_run即可實現對sp_test_handle的非同步呼叫;

2.實現步驟

1.建立處理業務的儲存過程:sp_test_handle

create or replace procedure sp_test_handle(v_task_id number
--任務編號 ) as ----------------------------------------------------------------------- -- 功能: 儲存過程非同步處理測試 -- 建立: lidongping 2020-9-30 ----------------------------------------------------------------------- begin -- 引數檢查 if (v_task_id is null) then dbms_output.put_line(
'v_task_id 為空'); return; end if; -- 處理業務 dbms_output.put_line('處理複雜的業務:' || v_task_id); exception when others then rollback; dbms_output.put_line('處理異常:' || v_task_id); end;

2.建立觸發業務的job:TEST_HANDLE_JOBS

3.建立客戶端呼叫的儲存過程:sp_test_handle_run

create or replace procedure sp_test_handle_run(v_task_id number
, -- 批次號 v_out_code out number, -- 錯誤碼 v_out_msg out varchar2) -- 錯誤訊息 as ----------------------------------------------------------------------- -- 功能: 執行任務 ----------------------------------------------------------------------- l_job_name varchar2(128) := 'TEST_HANDLE_JOBS'; begin -- 設定儲存過程引數 dbms_scheduler.set_job_argument_value(job_name => l_job_name, argument_position => 1, argument_value => v_task_id); -- 啟動job dbms_scheduler.enable(l_job_name); v_out_code := error_code.success; v_out_msg := '操作成功'; exception when others then rollback; v_out_code := error_code.failed; v_out_msg := '過程異常:' || sqlerrm; end;

4.客戶端呼叫儲存過程sp_test_handle_run即可實現對sp_test_handle的非同步呼叫;

完美!