如何在“当前账套”类型的连接器中执行SQL从存储过程获得查询结果

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

如何在“当前账套”类型的连接器中执行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从存储过程获得查询结果

作者:禹老师1 背景在某客户项目中,开发人员在苍穹的数据库中设计了一个存储过程 fuc_cas_voucherinf 获取查询结果,并希望通过SELECT...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息