儲存過程實現可擴充套件靈活介面

2021-07-25 05:15:50 字數 2777 閱讀 9756

今日奇聞

2016-12-06 08:31

本文分享乙個通過資料庫(oracle)的儲存過程,遵循「對修改封閉,對增加開放」的開閉原則,實現的可擴充套件性極強的靈活介面方案。

本人從事離散型mes系統的開發工作,近期負責了乙個pcba(電子、手機)行業的mes系統二開工作。pcba行業使用ate工具(自動測試工具)進行寫號、查號、置標誌位等工作,寫號查號等相關資料需要與mes系統進行資料互動,同時mes系統也需要管控ate工具的作業流程。如查號必須在寫號後,沒有寫號的工具不能進行查號等流程管控。由於ate工具的測試不須人員參與,所以mes系統需要開發相關介面給ate工具端呼叫,進行資料互動和流程管控等工作。

mes系統前期已有途程檢查,分配imei、mac、bt資料,過站等相關基礎介面可供ate工具呼叫,基本能滿足要求。但在面對某些客戶定製化的需求時(如上傳軟體版本、記錄測試內容),就必須在原有介面的基礎上增加或修改程式,然後把c#編寫的dll封裝成com元件(因為ate工具使用c++編寫的),更新文件,再通知ate工具編寫人員重新連入新版本進行編寫和除錯,最後再更新現有工具的所有版本。別看流程描述起來比較簡單,但實際操作起來涉及到溝通、部門協作等問題,非常繁瑣累人。

基於上述原因,筆者思考是否有乙個方案能夠靈活面對客戶的定製化需求,又不需涉及到太多變更,特別是重新編譯、重新連入和更新等操作。有志者事竟成,經過一番研究與思考後,筆者決定採用「儲存過程」來進行實現。

為了更好的講述該方案,下面將以**(或偽**)的方式進行講述。

public bool setatedata(string icmdtype, string itext, out string otext, out string oerrmessage)

對該方法的詳細介紹如下:

bool setatedata(string icmdtype, string itext, string otext, string oerrmessage)

引數說明

icmdtype----傳入的介面**,如1001;可自定義

itext-----------傳入此介面引數列表,採用鍵值對的方式傳入,以「|」分隔,例如:

「field1=value1|field2=value2|field3=value3|... … 」(也可定義其他分隔符,如有需要,請考慮轉義字元)

otext----------如介面需要返回引數的列表,採用鍵值對的方式輸出,以「|」分隔,例如:

「key1=value1| key2=value2| key3=value3|... … 「,可為空

oerrmessage----當方法返回false時,傳出具體的出錯資訊

注:execproc.procinputpara(icmdtype, itext, out otext, out oerrmessage)是筆者寫的乙個靜態方法,用於呼叫儲存過程。實際應用中需要自行編寫。為了做好記錄,筆者也會上傳該靜態類,僅供參考。

根據傳入的icmdtype查詢對應的儲存過程名稱,若存在則動態執行該儲存過程。

儲存儲存過程的**結構如下所示:

儲存過程的**(oracle 11g版本)如下所示:

create

or replace procedure procdllbase (icmdtype in varchar2,itext in

varchar2,otext out varchar2,oerrmsg out varchar2,oresult out integer)

asv_sql varchar2(4000);

v_procname tblprocgroup.procname%type;

i_proccount integer;

begin

select count(1) into i_proccount from tblprocgroup where

procid=icmdtype;

if i_proccount=0 then

oerrmsg:='cmdtype2proc_not_found';

oresult:=0;

return;

end if;

select procname into v_procname from tblprocgroup where

procid=icmdtype;

v_sql:='begin '|| v_procname ||

'(:itext,:otext,:oerrmsg,:oresult);end;';

execute immediate v_sql using in itext,out otext,out oerrmsg,out

oresult;

exception

when others then

rollback;

oerrmsg:='cmdtype2proc_unknown_error';

oresult:=0;

return;

end procdllbase;

根據業務需求編寫對應的儲存過程,並將icmdtype與儲存過程名稱關聯後儲存至tblprocgroup**中。

子儲存過程中涉及到輸入引數的解析,輸入引數的非空性校驗及重複性校驗,這些都是保證系統穩健性的需要。

通過上述方案,當客戶再有其他需求時,只需根據業務邏輯建立儲存過程並分配icmdtype與之關聯即可實現介面的擴充套件。

ate工具開發人員也只需要按照文件的格式傳參並解析輸出引數即可,免卻編譯程式,封裝com元件及更新的繁瑣流程。

靈活可擴充套件的工作流管理平台Airflow

airflow是airbnb開源的乙個用python寫就的工作流管理平台 workflow management platform 在前一篇文章中,介紹了如何用crontab管理資料流,但是缺點也是顯而易見。針對於crontab的缺點,靈活可擴充套件的airflow具有以下特點 下表給出airflo...

mssql 危險擴充套件儲存過程

drop procedure sp makewebtask exec master.sp dropextendedproc xp cmdshell exec master.sp dropextendedproc xp dirtree exec master.sp dropextendedproc x...

c 呼叫儲存過程實現登入介面詳解

1,建立儲存過程 複製 如下 create proc pro login username nvarcharchmmjhr 10 password nvarchar 10 as select from user username usernwww.cppcns.comame and password...