报表切换数据库时怎样自动转换 SQL?
不同类型数据库的函数语法或多或少存在差异,当报表切换数据库时,报表中那些包含差异化函数语法的SQL也需要随之转换。而通常报表工具中的SQL数据集是写死的,需要把相应SQL手动修改后替换,无法实现自动转换。
使用集算器 SPL就能容易做到切换数据库时自动为报表转换SQL。SPL设计了一套标准的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提供了JDBC供Java调用,报表工具可以像调用数据库存储过程的方式一样调用SPL脚本。
把转换代码写成SPL脚本(sqlquery.dfx):
A |
|
1 |
=connect(dbtype) |
2 |
=A1.query@x(SQL.sqltranslate(dbtype)) |
其中参数dbtype为数据库类型(这里同数据源名称),参数SQL为SPL的标准SQL
在报表工具数据集中调用 SPL 脚本(类似调用存储过程的方式,支持传参)即可:
{call sqlquery(?,?)}