存储过程实现可扩展灵活接口
序言
本文分享一个通过数据库(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){return ExecProc.ProcInputPara(iCmdType, iText, out oText, out 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) AS v_Sql varchar2(4000); v_ProcName TBLPROCGROUP.PROCNAME%TYPE; i_ProcCount integer; BEGINSELECT COUNT(1) INTO i_ProcCount from TBLPROCGROUP where PROCID=ICMDTYPE;IF i_ProcCount=0 THENOERRMSG:='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;EXCEPTIONWHEN OTHERS THENROLLBACK;OERRMSG:='CMDTYPE2PROC_UNKNOWN_ERROR';ORESULT:=0;RETURN; END PROCDLLBASE;
子存储过程
根据业务需求编写对应的存储过程,并将iCmdType与存储过程名称关联后储存至TBLPROCGROUP表格中。
子存储过程中涉及到输入参数的解析,输入参数的非空性校验及重复性校验,这些都是保证系统稳健性的需要。
总结
通过上述方案,当客户再有其他需求时,只需根据业务逻辑创建存储过程并分配iCmdType与之关联即可实现接口的扩展。
ATE工具开发人员也只需要按照文档的格式传参并解析输出参数即可,免却编译程序,封装COM组件及更新的繁琐流程。
转载于:https://www.cnblogs.com/huangmianwu/p/6133715.html
存储过程实现可扩展灵活接口相关推荐
- Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口...
Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口. Surface UEFI 提供新功能,如启动更快速.安全性更高.可替换 ...
- C#高级编程——C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)——图文详解加源码
C#高级编程--C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)--图文详解加源码 前言
- UEFI统一可扩展固件接口
统一可扩展固件接口(英语:Unified Extensible Firmware Interface,缩写UEFI)是一种个人电脑系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代 ...
- 网狐获取服务器信息,网狐服务端扩展业务接口手册
互联网的精神是开放的,是分享的.开放,使它不存在时间和地域的界限,知识的获取在互联网时代变得简单.而分享精神,更是互联网发展的原动力,它让不同的见解得以交流,各式各样的需求得到满足. 网狐科技成立于2 ...
- 动态扩展Rest接口地址,动态卸载Rest接口
动态扩展Rest接口地址,动态卸载Rest接口 import org.apache.commons.io.FilenameUtils; import org.springframework.beans ...
- java中的抽象类和接口可以实例化吗?,它们可以有构造方法吗?(扩展:接口和抽象类的区别)
结论1:不可以实例化: 解释: 我们这里讨论的实例化是 抽象类类名 抽象类对象名 = new 抽象类类名(参数可能有可能无) 这种形式. 抽象方法不能有方法体!你说它们实例化了有啥意义. 结论2:接口 ...
- 实现自定义扩展点_spring扩展API接口介绍
对spring进行定制化功能扩展时,可以选择如下一些扩展点: BeanFactoryPostProcessor 是beanFactory后置处理器,支持在bean factory标准初始化完成后,对b ...
- HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞|type c 扩展坞接口功能说明
硕盟SM-T54是一款 TYPE C转HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞,支持四口同时使用,您可以将含有USB 3.1协议的电脑主机,通过此产品连接到具有HDMI或VGA的显 ...
- 2020 MacBook Pro 扩展坞接口失灵解决办法
这两天突然碰到扩展坞失灵的情况, 我以为是扩展坞坏了,还准备再买一个,同事跟我说是因为最新版本系统的问题,让我把电源拔掉,只插扩展坞试试, 我试了一下,立刻就连接上了, 很稳定. 应该是这次Mac系统 ...
最新文章
- ASP.NET Razor – C# 逻辑条件简介
- rocketmq基本安装与使用(一)
- 每天一道LeetCode-----从有序数组中删除重复元素
- js优化阿里云图片加载(一)
- linux oracle手动启动两个实例
- 1006实验一实验报告
- 在淘宝,我们是这样衡量代码质量的
- MyEclipse编码设置,中文乱码解决方法,UTF-8,GBK
- carve into_最新carve的用法和短语例句
- 关于vue-cli中-webkit-flex-direction: column失效问题
- 服务器虚拟机怎么安装win7系统教程,虚拟机怎么安装系统?VMware虚拟机安装Win7和win10图文详细教程...
- 分析案例:贷款逾期分析
- 【css】巧用border制作三角形
- 创建一个xposed模块Demo
- Java程序中操作Word表格
- checkbox 选中触发js事件
- 分享45个android实例源码,很好很强大.收藏吧!!! http://www.apkbus.com/forum.php?mod=viewthreadtid=20978 (出处: Android开
- Windows快捷键的使用
- php curl请求 和 打印日志
- 001还在搞不清自动化测吗,看完这一篇文档带你深入剖析
热门文章
- python中cumsum_在python里“np.cumsum”这个命令是干什么的?怎么使用?
- 2018-2019-1 20165303 实验五 通讯协议设计
- [包计划] node-fs-extra
- 21 RadioGroup ListFragment
- webScoket的浅短的认识
- C++处理一个动态规划的问题
- 接口测试客户端的搭建
- Ubuntu 8.04下Netbeans的字体反锯齿解决(转)
- windows环境下nginx的入门配置跳转tomcat
- 第8章-常用优先级和css3