|
|
|
|
使用BL_runQuerySql、BL_insertSql等bizlet时容易出错的两点 发布时间:2006-02-21 00:00:00 作者:cservice 出处:goComDevCenter 语言:中文 阅读次数:1755次 |
| 使用BL_runQuerySql、BL_insertSql等bizlet时容易出错的两点
【适用范围】
通用
【内容】
在使用BL_runQuerySql、BL_insertSql等bizlet时,最容易导致出错有以下两点:
1、设置参数时存在sql的节点的节点类型没有指定正确
BL_runQuerySql、BL_insertSql等这些bizlet有一个共同点,就是要输入一个sql让bizlet来执行。输入sql有两种方式,一是直接输入sql,即为常量;二是sql存放在节点中,然后输入该节点的xpath,即变量。
通常使用的是第二种方式,把sql做为变量输入。这时就要注意指定输入参数的节点类型为变量,如果节点类型是常量,那么EOS当然就将节点的xpath当然sql来执行了,结果肯定就会出错了。
这个错误通过日志eos.log很容易就可以定位出来,在执行sql的时候,日志中做记录,比如
- @@[@level][INFO][@requestID][-1][@module][DB][@sql][sqlString][@timestamp][2006.02.21 at 18:00:21 478][@sender][defaultAppID.com.primeton.tp.core.dataservice.sql.SQLStatement]$$
以上是执行错误的日志,以下是执行正确的日志
- @@[@level][INFO][@requestID][-1][@module][DB][@sql][select * from eosoperator][@timestamp][2006.02.21 at 18:01:24 999][@sender][defaultAppID.com.primeton.tp.core.dataservice.sql.SQLStatement]$$
通过日志中[@sql]所记录的信息很容易就可以判断出问题在哪里。
2、查询语句中使用函数注意指定别名
例如使用BL_runQuerySql查询eosoperator表中用户总数,sql写成select Count(*) from eosoperator。
sql本身没有任何问题,在EOS执行也是正确的,从eos.log日志中记录的信息可以判断出:
- @@[@level][INFO][@requestID][-1][@module][DB][@sql][select count(*) from eosoperator][@timestamp][2006.02.21 at 18:57:16 699][@sender][defaultAppID.com.primeton.tp.core.dataservice.sql.SQLStatement]$$
- @@[@level][DEBUG][@requestID][-1][@module][DB][@other][执行时间 = 0.01 s ][@timestamp][2006.02.21 at 18:57:16 709][@sender][defaultAppID.com.primeton.tp.core.dataservice.sql.SQLStatement]$$
- @@[@level][ERROR][@requestID][-1][@other][java.lang.reflect.InvocationTargetException
...
日志中记录了sql的执行时间,证明sql已经执行完成。而出错信息是记录sql执行时间之后,所以不是sql执行的问题。如果仔细查看异常信息,可以看出是与xml有关的错误。
这个错误是因为sql中没有给count(*)指定别名,EOS在执行sql结果后将查询结果组成dom数据时出错。
将sql改成select Count(*) count from eosoperator,执行正确。返回结果为<list rowNum="1"><entity rowNum="0"><count>9</count></entity></list>
同样的的道理,如果使用了其它函数,如substr(),max()等等,都会出现类似的错误。
【备注】
|
|
| 声明:本栏目转载文字、造型、样式、图形及程序如有来自网络,版权归原作者或首发媒体所有,欢迎任何个人访问或者转载,若有作者及出处有误,请来信说明,我们将及时更正。 |
|