今日奇聞
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根據業務需求編寫對應的儲存過程,並將icmdtype與儲存過程名稱關聯後儲存至tblprocgroup**中。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與之關聯即可實現介面的擴充套件。
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...