报表切换数据库时怎样自动转换 SQL?

 

不同类型数据库的函数语法或多或少存在差异,当报表切换数据库时,报表中那些包含差异化函数语法的SQL也需要随之转换。而通常报表工具中的SQL数据集是写死的,需要把相应SQL手动修改后替换,无法实现自动转换。

使用集算器 SPL就能容易做到切换数据库时自动为报表转换SQLSPL设计了一套标准的SQL查询语法,该语法内置大量函数(还在持续追加中),可描述更多常运算。SPL中有一个sqltranslate函数,可以把这种标准SQL翻译成不同数据库的SQL

比如这样的标准SQL

SELECT CLIENT, YEAR(ORDERDATE), SUM(AMOUNT)

            , COUNT(ORDERID)

FROM ORDERS

GROUP BY CLIENT, YEAR(ORDERDATE)

HAVING SUM(AMOUNT) > 2000

.sqltranlate("MYSQL")翻译后就得到:

SELECT CLIENT, YEAR(ORDERDATE), SUM(AMOUNT)

            , COUNT(ORDERID)

FROM ORDERS

GROUP BY CLIENT, YEAR(ORDERDATE)

HAVING SUM(AMOUNT) > 2000

而如果使用.sqltranslate("ORACLE")将返回:

SELECT CLIENT, EXTRACT(YEAR FROM ORDERDATE), SUM(AMOUNT)

            , COUNT(ORDERID)

FROM ORDERS

GROUP BY CLIENT, EXTRACT(YEAR FROM ORDERDATE)

HAVING SUM(AMOUNT) > 2000

可以看到,标准函数能够正确地根据数据库选择相应的函数。

集算器SPL提供了JDBCJava调用,报表工具可以像调用数据库存储过程的方式一样调用SPL脚本。

把转换代码写成SPL脚本(sqlquery.dfx):


A

1

=connect(dbtype)

2

=A1.query@x(SQL.sqltranslate(dbtype))

其中参数dbtype为数据库类型(这里同数据源名称),参数SQLSPL的标准SQL

在报表工具数据集中调用 SPL 脚本(类似调用存储过程的方式,支持传参)即可:

 {call sqlquery(?,?)}