存储过程实现可扩展灵活接口

序言

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 缓冲区中的数据存入缓冲区中_java8中NIO缓冲区(Buffer)的数据存储详解|chu...

java8新特性NIO缓冲区(Buffer)的数据存储。ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer.1、缓冲区在java nio中负责数据的存储。缓冲区就是数组。用于存储不同数据类型的数据。根据数据类型不同(boole…

mysql 循环体 如何测试_mysql里如何循环插入数据,进行测试

比如从现在开始一直循环到后年,比如设置8根管线,一直循环下去进行数据叠加,下面是C#代码,不知道怎么写下去了private void button1_Click(object sender, EventArgs e){connectionString “SERVER” server “;” “DATABASE”…

mysql的安装备份恢复_安装使用Percona XtraBackup来备份恢复MySQL的教程

1.安装XtraBackupyum的安装方法:自动$ rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm然后会看到:Retrieving http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpmPrepa…

屏幕尺寸

屏幕尺寸分析 <!DOCTYPE html> <script src"js/jquery-1.11.3.js" type"text/javascript"></script> <html> <head><title>aaa</title><style>body{margin:10px;padding:10px;border:10px solid #000;}&l…

java while do_java中while和do-while的总结

主要内容&#xff1a;1、while循环在程序中的应用2、do-while循环在程序中的应用3、循环结构与判断结构相互嵌套----------------------------------------------------------------------------------------------一、while语法&#xff1b;while(循环条件){循环体}代码演示&a…

scrollWidth,clientWidth,offsetWidth的区别

通过一个demo测试这三个属性的差别。 说明&#xff1a; scrollWidth&#xff1a;对象的实际内容的宽度&#xff0c;不包边线宽度&#xff0c;会随对象中内容超过可视区后而变大。 clientWidth&#xff1a;对象内容的可视区的宽度&#xff0c;不包滚动条等边线&#xff0c;会随对…

java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...

java 自定义加载器&#xff0c;加载spring包&#xff0c;动态加载实现&#xff0c;jar包隔离&#xff0c;tomcat加载webapp方式发布时间&#xff1a;2018-08-20 12:02,浏览次数&#xff1a;774, 标签&#xff1a;javaspringjartomcatwebapp加载器加载的是配置好classpath路径上…

C#递归、动态规划计算斐波那契数列

//递归public static long recurFib(int num){if (num < 2){return num;}else{return recurFib(num - 1) recurFib(num - 2);}}//动态规划public static long dynFib(int num){int[] nums new int[num];for (int i 0; i < num; i){nums[i] 0;}if (num 1 || num 2){…

java随机产生十个坐标_java中随机坐标

你的问题有两个&#xff1a;1、出现的位置不允许再出现2、当所有的位置都为1的时候&#xff0c;程序完成(地鼠已经去过所有的地洞&#xff0c;而且没有重复)。如果你的问题是这样的话&#xff0c;答案如下&#xff1a;整个的思路&#xff1a;有一个地鼠类&#xff0c;地鼠类里面…

java中使用几率_Java中使用蒙特卡洛算法计算德州扑克成牌概率(二)- 计算牌面分值...

德州扑克中比较重要的一个算法就是计算牌面的得分&#xff0c;不仅仅关乎概率计算的结果&#xff0c;同时也需要很高的性能。蒙特卡洛算法计算的次数越多结果越准确&#xff0c;因此算法的性能至关重要。下面是一个高性能的牌面java计算算法。参数介绍&#xff1a;1)cards 需要…

ubuntu14.04 upgrade出现【Ubuntu is running in low-graphics mode】问题的一个解决办法

在ubuntu14.04上安装docker的时候&#xff0c;由于眼花没看清下图这句话&#xff1a; 直接执行了sudo apt-get upgrade命令。然后发生了一个悲剧&#xff01; 重启后出现下面这个错误&#xff01; 而且在点击OK进入下一步后&#xff0c;再也无法选中其他的配置选项……当时我就…

java 类及对象的课后作业_JAVA类和对象课后作业

1.使用类的静态字段和构造函数&#xff0c;我们可以跟踪某个类所创建对象的个数。请写一个类&#xff0c;在任何时候都可以向它查询“你已经创建了多少个对象&#xff1f;”代码&#xff1a;//显示类//YiMingLai 2016.10.19public class lei {/*** param args*/public static v…

正则表达式二探

什么是正则表达式。 简单说就是按照某种规则匹配符合条件的字符串。 通配符&#xff1a;* https://regexper.com/在线测试正则表达网址。 转载于:https://www.cnblogs.com/tuoxiong/p/6148037.html

java 怎么用 string method return数量_java教程之Map应该怎么用

java教程之Map应该怎么用在自学或者看java教程的时候&#xff0c;大家多多少少都存在着这样或者那样的疑惑&#xff0c;对于这些中软国际小编一直也在整理&#xff0c;今天为大家献上的是关于Map应该怎样去用的一些方法&#xff0c;还是跟过去一样&#xff0c;在这里&#xff0…

使用 ExecuteMultiple 提高批量数据加载的性能

您可以使用 ExecuteMultipleRequest 消息在 Microsoft Dynamics CRM Online 2016 Update 和 Microsoft Dynamics CRM 2016&#xff08;本地&#xff09; 中&#xff08;尤其在 Internet 延迟可能是最大限制因素的 Microsoft Dynamics CRM Online 中&#xff09;支持更高吞吐批量…

安装ODIS报错 java_(实用技术)大众奥迪ODIS常见问题处理方法

我们在平时使用ODIS过程中常常会遇到一下问题&#xff0c;导致我们不知道应该怎么处理。今天这篇文章中我们将陈列一些常见的问题解答&#xff0c;希望对大家有帮助。一、BCM(BFM)的引导型功能不能用解决方案如果桑塔纳&#xff0c;Rapid&#xff0c;新polo等车型遇到BCM(BFM)的…

gulp入坑系列(1)——安装gulp

前言 好吧&#xff0c;我承认我是为了搞定Sass编译CSS文件的问题&#xff0c;迷一样的着手入gulp的坑&#xff0c;sass和gulp的爬坑历程大概会一起更新。然后感觉这里windows和mac的流程差不多&#xff0c;不过mac的通常在指令前加sudo &#xff0c;本喵是windows的本本&#x…

java中的sql语句书写_Java中sql语句之通配符*

在java中执行SQL语句要特别注意通配符的问题&#xff0c;否则是不会成功的&#xff1a;在ACCESS中的通配符是*例&#xff1a;select * from student where name like 张*在标准的SQL语言中的通配符是%例&#xff1a;select * from student where name like 张%在java…

Oracle 数据库中对记录进行分页处理

学习到 oracle 的视图的时候&#xff0c;了解到对 Oracle 中数据的记录进行分页处理和 Mysql 提供的 limit 来进行分页处理大有不同&#xff0c;limit 是 mysql 中特有的关键字。 那么在 oracle 中如何实现对记录的分页处理呢&#xff1f; 解决办法&#xff1a;使用 ROWNUM 1.…

python中split啥意思_python中split的用法详解_后端开发

如何用python正则表达式匹配字符串&#xff1f;_后端开发用python正则表达式匹配字符串的方法&#xff1a;1、当匹配单个位置的字符串时&#xff0c;可以使用【(.?)】正则表达式来提取&#xff1b;2、当连续多个位置的字符串匹配时&#xff0c;可以使用【?P…】这个正则表达式…