
客户端制作扩展报表数据集时,有时会因为一些语法或数据库差异导致查询报错,导致报错的可能原因大概有以下原因,可参考进行问题分析排查。
1.使用with关键字
对于客户使用SQL Server数据库时,偶尔会碰到一些奇怪的问题,在其他类型数据库可以正常执行的SQL数据集,同样的SQL在SQL Server数据库执行却报错。
如:WITH TEMP AS(SELECT * FROM TableA)
SELECT * FROM TEMP;
该种语法在工具连接SQL Server数据库时可正常执行。

客户端连接SQL Server数据库执行数据集会报错,


报错原因分析:报表调用引擎执行取数sql时,引擎接口做了一些分页等其他操作后在源sql外层包装了一些select查询语句,导致with语句部分被作为了子查询,而SQL Server数据库不支持with作为子查询,故执行会报上面截图错误。

SQL Server工具中执行with子查询也会执行报错。

建议:客户端连接SQL Server数据库时,避免使用with语法,Oracle、PostgreSQL数据库可以正常使用。
2.union和union all关键字
客户端连接PostgreSQL数据库时,使用union或者union all拼接多段select查询时报错。

错误原因分析:报表在检查sql语法的正确性时,会在每一个select语句中增加top关键字进行语法校验,引擎后面在做sql解析时,会根据数据库类型做分页处理,如转成limit语句,由于报表在多个select中都加了top关键字,导致引擎截取的时候只从最后一个limit截取,sql就会不完整,执行报错。

解决方案:报表优化处理sql的代码,对于多个select使用union或union all时,在最外层包装top检验语法,避免出现多个top影响引擎解析sql,如select top n * from (select fnumber from a union all select fnumber from b )。
|版本|领域|补丁号|
|-|-|-|
|EAS861|报表中心|PT167299|
3.存储过程数据集执行没有数据
部分客户EAS800升级到EAS861之后,存储过程数据集执行后没有数据,EAS820执行有数据。
问题分析:打开扩展报表控制台查看sql执行情况。


通过控制台日志发现,数据集部分参数不选参数值时,最终绑定的存储过程数据集参数却拼接了=null的参数值,导致最终执行存储过程时没有数据展示。
调试代码发现,没有选择参数值的参数,在设置参数值的时候都设置了null,在预编译的时候通过prepareStatement.setNull(i,sqlType)是会处理成param = null,导致没有数据。
解决方案:EAS861更新补丁解决。
|版本|领域|补丁号|
|-|-|-|
|EAS861|报表中心|PT168788|
4.PostgreSQL数据库中数据集执行报错
客户端连接PostgreSQL数据库时,点击宏定义或数据集参数引用宏时,点击详细设置按钮报错。


原因分析:PostgreSQL中,新增宏定义时,由于宏描述字段为非必填字段(查看表结构NULLABLE=TRUE),用户没有填写该字段时,可正常进行保存,当再次编辑时,引擎序列化该字段时,由于字段长度为0,因此代码执行会抛出以上截图的异常。

解决方案:引擎序列化长度为0字段时,直接返回null即可,EAS861已有补丁解决。
|版本|领域|补丁号|
|-|-|-|
|EAS861|BOS_RTE|PT165027|
**后续持续完善补充其他场景...**