测试报表传递参数的一个现象
一、bug 疑似?
如果报表中要传递一个参数 fname ,给 spl
如果采用这种格式
call testpara(${fname},)
只要在参数后面增加一个 "," 就能正常返回。那么 fname 为空情况下,就全量返回。
这个是否会是 SPL 在处理这个部分有 bug?
二、如果要对报表过来的参数进行调整
在报表中,加双引号,需要采用转义符,如
CONCAT(“"”,name,“"”)
这个是否可以在 SPL 中实现。针对所有的传入参数,进行 AOP 的拦截处理。或者中 Node 类或 Function 类中,统一在 calculate 方法之前处理。
处理的方法,可以采用接口的方式进行开放,方便入参的格式调整。如果要采用 AOP,用 Spring 的框架,可能更方便
1,java 或者其他工具调用 spl,可以把 spl 当做一个存储过程调用,那么 java 或者其他工具中调用 spl 一般就是 call test(?), 有参数的话,里边加问号,然后再给这个问号传递对应的参数,比如 java 中 PreparedStatement.setObject(1, “参数值”); 这样就将参数值传递给 spl 了。
问题 2,没太看明白
这不是 SPL 的 BUG,是你的报表工具的问题,它不支持标准存储过程的参数机制,会给做成宏替换了。之前说过,这种机制灵活是灵活了,但非常危险,很容易造成 SQL 植入的严重安全问题。
之所以加个逗号能对,是因为传入的是 call testpara(,),这时候 SPL 会把带有逗号的字符串解释成至少有一个参数,没填值就自动把这个参数赋值为 null。如果啥也不写,那传入的是 call testpara(),SPL 认为这里没参数,也不会给参数赋值,结果参数没定义就会出错。
去找你的报表工具厂商,问问有没有正常用参数调用存储过程的接口,如果没有就建议他们改正,否则安全隐患巨大。
SPL 用的是标准存储过程接口,发现有问题,可以先尝试一下调用数据库存储过程是不是对,如果数据库对,SPL 不对,这可以判断出 SPL 的接口实现有 BUG,如果数据库也不对,那是主程序(报表工具)搞得不对。