如何在“当前账套”类型的连接器中执行SQL从存储过程获得查询结果
作者:禹老师
1 背景
在某客户项目中,开发人员在苍穹的数据库中设计了一个存储过程 fuc_cas_voucherinf 获取查询结果,并希望通过SELECT语句对查询结果进行过滤。在SQL查询分析器执行,验证该SQL是数据库上是可以执行的,如下图:
在服务流程的脚本中,该开发输入如下SQL语句,通过execute_call函数调用。执行失败,错误原因如下图所示。
2 原因分析
因为当前账套不支持调用存储过程。考虑到苍穹适配多种数据库,为防止数据库私有技术导致数据库迁移的复杂性,苍穹平台原则上禁止使用数据库的函数、存储过程、触发器。但在项目上,使用数据库的私有技术在特定情况下可以简化业务实现,仍然具有一定的必要性。比如:此文档所示使用存储过程返回查询结果。
为避开平台的限制,对于返回临时表的存储过程,可以当成普通的SELECT语句执行,但要注意数据库分库标识必须附加在存储过程名后面,且分库标识后必须加上空格与括号分隔,类似下面的写法。并使用 query_list 函数执行查询。
SELECT * FROM fuc_cas_voucherinf@fi () WHERE fnumber='xxx'
注意:数据库分库 @fi 与后面的括号之间必须有空格,否则将发生如下异常。
在成功的将SQL传递到平台的KSQL层后,由于KSQL不支持存储过程作为临时表,将发生如下异常:
3 解决方法
因此,SQL语句必须写成如下形式,告诉KSQL对SQL不做解析直接传递给数据库执行。
/*dialect*/SELECT * FROM fuc_cas_voucherinf@fi () WHERE fnumber='xxx'
最终,在集成云的服务流程的脚本中成功执行SQL从存储过程返回的查询结果中过滤出了满足条件的数据。
总结:在上述脚本中,使用以下手段避开了平台的限制。
(1) 在SQL中以 /*dialect*/ 开头,通知KSQL不解析SQL,绕开KSQL的语法限制;
(2) 在数据库分库标识与括号间加入空格,避免当前账套连接器误判分库标识;
使用query_list函数执行查询,调用存储过程(注意:仅适合本文档所述场景)。
如何在“当前账套”类型的连接器中执行SQL从存储过程获得查询结果
本文2024-09-23 00:48:18发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-141847.html