序言

本文分享一个通过数据库(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

存储过程实现可扩展灵活接口相关推荐

  1. Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口...

    Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口. Surface UEFI 提供新功能,如启动更快速.安全性更高.可替换 ...

  2. C#高级编程——C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)——图文详解加源码

    C#高级编程--C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)--图文详解加源码 前言

  3. UEFI统一可扩展固件接口

    统一可扩展固件接口(英语:Unified Extensible Firmware Interface,缩写UEFI)是一种个人电脑系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代 ...

  4. 网狐获取服务器信息,网狐服务端扩展业务接口手册

    互联网的精神是开放的,是分享的.开放,使它不存在时间和地域的界限,知识的获取在互联网时代变得简单.而分享精神,更是互联网发展的原动力,它让不同的见解得以交流,各式各样的需求得到满足. 网狐科技成立于2 ...

  5. 动态扩展Rest接口地址,动态卸载Rest接口

    动态扩展Rest接口地址,动态卸载Rest接口 import org.apache.commons.io.FilenameUtils; import org.springframework.beans ...

  6. java中的抽象类和接口可以实例化吗?,它们可以有构造方法吗?(扩展:接口和抽象类的区别)

    结论1:不可以实例化: 解释: 我们这里讨论的实例化是 抽象类类名 抽象类对象名 = new 抽象类类名(参数可能有可能无) 这种形式. 抽象方法不能有方法体!你说它们实例化了有啥意义. 结论2:接口 ...

  7. 实现自定义扩展点_spring扩展API接口介绍

    对spring进行定制化功能扩展时,可以选择如下一些扩展点: BeanFactoryPostProcessor 是beanFactory后置处理器,支持在bean factory标准初始化完成后,对b ...

  8. HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞|type c 扩展坞接口功能说明

    硕盟SM-T54是一款 TYPE C转HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞,支持四口同时使用,您可以将含有USB 3.1协议的电脑主机,通过此产品连接到具有HDMI或VGA的显 ...

  9. 2020 MacBook Pro 扩展坞接口失灵解决办法

    这两天突然碰到扩展坞失灵的情况, 我以为是扩展坞坏了,还准备再买一个,同事跟我说是因为最新版本系统的问题,让我把电源拔掉,只插扩展坞试试, 我试了一下,立刻就连接上了, 很稳定. 应该是这次Mac系统 ...

最新文章

  1. ASP.NET Razor – C# 逻辑条件简介
  2. rocketmq基本安装与使用(一)
  3. 每天一道LeetCode-----从有序数组中删除重复元素
  4. js优化阿里云图片加载(一)
  5. linux oracle手动启动两个实例
  6. 1006实验一实验报告
  7. 在淘宝,我们是这样衡量代码质量的
  8. MyEclipse编码设置,中文乱码解决方法,UTF-8,GBK
  9. carve into_最新carve的用法和短语例句
  10. 关于vue-cli中-webkit-flex-direction: column失效问题
  11. 服务器虚拟机怎么安装win7系统教程,虚拟机怎么安装系统?VMware虚拟机安装Win7和win10图文详细教程...
  12. 分析案例:贷款逾期分析
  13. 【css】巧用border制作三角形
  14. 创建一个xposed模块Demo
  15. Java程序中操作Word表格
  16. checkbox 选中触发js事件
  17. 分享45个android实例源码,很好很强大.收藏吧!!! http://www.apkbus.com/forum.php?mod=viewthreadtid=20978 (出处: Android开
  18. Windows快捷键的使用
  19. php curl请求 和 打印日志
  20. 001还在搞不清自动化测吗,看完这一篇文档带你深入剖析

热门文章

  1. python中cumsum_在python里“np.cumsum”这个命令是干什么的?怎么使用?
  2. 2018-2019-1 20165303 实验五 通讯协议设计
  3. [包计划] node-fs-extra
  4. 21 RadioGroup ListFragment
  5. webScoket的浅短的认识
  6. C++处理一个动态规划的问题
  7. 接口测试客户端的搭建
  8. Ubuntu 8.04下Netbeans的字体反锯齿解决(转)
  9. windows环境下nginx的入门配置跳转tomcat
  10. 第8章-常用优先级和css3