文章
· 十月 22, 2022 阅读大约需 4 分钟

通用SQL业务服务和业务操作

1. 新的系统SQL业务服务/业务操作

接连SQL数据源和操作SQL数据目标是常见的集成业务场景。使用SQL适配器监控SQL数据源和操作SQL目标库时,我们需要开发自定义BS或BO,写不少代码。例如开发自定义SQL服务需要:

1. 开发响应消息类,用于承接SQL快照数据;

2. 开发自定义业务服务BS类,用于将SQL快照按字段赋值给对应的消息,并将消息发送给目标(业务流程或业务操作)。

而要开发自定义SQL操作,更麻烦些:

1. 开发请求和响应消息类,用于向BO传输数据和接收返回数据;

2. 开发自定义业务服务BO类,设置消息响应表,根据不同请求消息类型编写方法;

3. 在方法中根据请求消息数据拼写SQL语句;

4. 在方法中将SQL执行结果存入响应消息。

虽然很简单,但编程过程枯燥乏味。而且当修改SQL语句时,还要修改对应的消息类和BS/BO类。

 

从2021.2开始,InterSystems IRIS增加了2套系统通用SQL业务服务和SQL业务操作:

BS EnsLib.SQL.Service.GenericService 使用SQL语句
BS EnsLib.SQL.Service.ProcService 使用存储过程
BO EnsLib.SQL.Operation.GenericOperation 使用SQL语句
BO EnsLib.SQL.Operation.ProcOperation 使用存储过程

只要直接将它们加入Production,就可以直接使用了,甚至无需再定义消息,真正实现无代码开发,nice!

 

2. 如何使用系统SQL业务服务/业务操作

下面我们来看看它们是怎么实现的,以及如何使用它们。

2.1 SQL业务服务

直接将EnsLib.SQL.Service.GenericService或EnsLib.SQL.Service.ProcService加入Production的BS中,并设置数据源、SQL语句和发送目标:

一步搞定,且无需使用IDE开发任何一行代码!laugh

 

那么SQL业务操作发送给目标业务组件的是什么消息呢?surprise

默认是Ens.StreamContainer,而结果集数据是以JSON表达并放在其Stream属性(流类型)下的,正好用到JSON免schema的特性。类似于:

如果你已经有一个消息类,想让SQL业务服务将结果集记录放在这个消息里?只要设置SQL业务服务的“消息类”即可:

当然,你自己定义的消息属性名要和返回的SQL结果集字段名一致,否则会报错。如果消息是以前定义好的,那么通过SQL语句使用AS来修改字段名最简单,例如SELECT NAME AS Display...

 

对如何操作JSON不熟?surprise

在InterSystems IRIS/Cache'里,系统类%DynamicObject就是JSON对象,它有方法%FromJSON可以直接将JSON字符串/字符流转为JSON对象。所以可以直接以对象的方式操作JSON,就像下面在业务流程里将Ens.StreamContainer的Stream属性转为JSON对象使用:

 

2.2 SQL 业务操作

同样,SQL业务操作也无需代码开发。直接将EnsLib.SQL.Operation.GenericOperation或EnsLib.SQL.Operation.ProcOperation加入Production,进行配置即可。

配置项除了SQL数据目标的连接信息外,就是要执行的SQL语句了:

在 查询 中添加SQL语句,如果SQL语句中有任何参数需要传入,用"?" 代表。例如

Insert into QP.Patient(Gender,Name) values(?,?)

如果SQL需要输入参数,在 输入参数 中按顺序添加需要的参数,一般情况下是使用请求消息里的属性,在需要用的属性名前面加 *,说明这个参数来自请求消息。例如*Sex,*Name。

好,配置完成,依然没写一行代码!laugh

 

但慢着,我们没有对这个BO定义请求消息呀?surprise

我们不需要事先声明任何请求消息类,EnsLib.SQL.Operation.GenericOperationEnsLib.SQL.Operation.ProcOperation可以接受任何类型的请求消息!

 

那么像上面的例子中提到的传入参数*Sex,*Name,是不是我必须要事先建一个请求消息类,里面有Sex和Name属性?surprise

完全不必要!你可以直接通过系统请求消息Ens.StreamContainerEns.StringContainerEns.StringRequest传入JSON字符串/字符流即可,SQL业务操作会自动将JSON实例化为JSON对象。因此上面例子,可以传入Ens.StringRequest,只要JSON字符串里有Sex和Name这2个数据即可。

例如你可以直接测试这个BO:

是不是非常方便!cool

* 注意:当使用Ens.StreamContainerEns.StringContainerEns.StringRequest 这些请求消息时,数据一定要是JSON格式的字符串/字符流,否则会得到报错信息!

 

那么SQL执行返回的结果在哪里?surprise

BO默认的响应消息是StreamContainer,因此执行结果都以JSON格式在它里面。

如果执行的SQL是INSERT/UPDATE/DELETE,那么返回的只有SQL语句影响的行数,放在NumRowsAffected里,如下:

如果执行的SQL是SELECT,则返回的是结果集如下:

如果你已经有定义过的消息类用于接收返回的SQL结果集,可以设置其“响应类”属性:

SQL业务操作会将返回结果集的第一行按字段名对应保存到响应消息的属性上。

*注意:当SQL返回的结果集有多行记录时,这种使用用户自定义响应消息的情况下,会在事件日志中记录一条信息,并只将结果集第一行对应到自定义响应消息中!

 

* 信息更新:在IRIS 2023.1及之后的版本中,配置页面与上面的截图有一点变化:

1. 输入参数改为逐一通过“添加”按钮进行添加,从而避免书写错误

2. 请求消息类可以指定了。如果您有自己定义好的请求消息,可以在下图“RequestClass”中选择。如果你继续想使用Ens.StreamContainerEns.StringContainerEns.StringRequest 这些系统请求消息时,请保留其为空。

 

今后连接SQL数据源和数据目标时,使用这2套系统SQL业务服务和业务操作,可以快乐地玩耍了!wink

讨论 (0)1
登录或注册以继续