语法问题处理
1. DB2问题处理
1.1 ERRORCODE=-4228, SQLSTATE=null错误
AIX下的Unrecognized JDBC type: 0. ERRORCODE=-4228, SQLSTATE=null错误。
原因是有参数为null值,类似下面这些sql就会报错。
如果是更新语句则是因为更新语句系统不会自动去掉null值条件,解决方式在开发系统增加isnull函数转换为指定值。
1.2 SQLCODE: -204, SQLSTATE: 42704错误
AIX下的SQLCODE: -204, SQLSTATE: 42704错误。
原因是由于db2不支持结果字段为子查询时,子查询里的子查询使用主查询表,详细解决方法参照《主要语法区别》- 14项。
1.3 union all后查不出数据
所有系统的db2中如下语句查不出数据
select * from(
select '1' type from BA_menu
union all
select 'cmd' type from BA_menu
) a
where a.type='1'
# a.type 修改为 trim(a.type)
select * from(
select '1' type from BA_menu
union all
select 'cmd' type from BA_menu
) a
where trim(a.type)='1'
原因是因为常量union all后db2会按数据里的最大字符长度填充空格,假设type为2个字符长度值为'1',所以union all后'1'就变成了'1 '。'1 '='1'
永远不成立,所以查不出数据。解决:使用trim去空格。
2. oracle问题处理
oracle10g中如果to_date方法字段参数中使用了case、when语法,在外层再使用to_char方法将返回错误信息,这时要使用to_char函数内部先转成字符,涉及的函数主要是datadiff函数,由于vsql未提供to_date、to_char函数,需要用户使用自定义函数在数据库里定义如: vsqlfunc_todate, vsqlfunc_tochar。示例如下:
select TO_CHAR(TO_DATE(a,'yyyy-MM-dd'),'yyyy-MM-dd')
from
(select CASE WHEN NVL('2', '1') != '2'
THEN TO_CHAR(SYSDATE, 'yyyy-MM-dd') ELSE '2013-08-13' END) a
from dual
) a
# 结果0000-00-00, 改为:
select TO_CHAR(TO_DATE(a,'yyyy-MM-dd'),'yyyy-MM-dd')
from
(select TO_CHAR(CASE WHEN NVL('2', '1') != '2'
THEN SYSDATE ELSE to_date('2013-08-13', 'yyyy-MM-dd') END,'yyyy-MM-dd') a
from dual
) a
3. 对参数null值的处理
VSQL将会自动对sql里的参数值为null值的进行特殊处理,处理逻辑如下:当条件表达式中的逻辑比较符为>,>=,<,<=,=,<>,like
或者是in操作符并且in里面只有一个参数时,VSQL将会删除参数中值为null的表达式(当表达式里有函数除外),即根据and、or逻辑符替换为指定的表达式(如1=1或者1=2),如:
例1:参数param1值为null值的特殊处理:
select a1 from a where a2 = :param1 and a3=2
# 处理成
select a1 from a where 1=1 and a3=2
例2:null值字符串链接 替换为 1=2
select a1 from a where a2 like '%'||:param1||'%' or a3=2
# 处理成
select a1 from a where 1 = 2 or a3 = 2
例3:
select a1 from a where a2 in (:param1)
# 处理成
select a1 from a where 1=1
例4:如果出现在case when中也会替换,如:
select case when a1=:param1 and a2=2 then a1 else a2 end from a
# 处理成
select case when 1=1 and a2=2 then a1 else a2 end from a
注意:如果条件表达式里面参数作为函数的参数则不处理,如:
select a1 from a where a2 = isnull(:param1,1) and a3=2 #函数的参数不处理
4. 对参数为空字串的处理
VSQL将会自动对sql里的参数值为空字串的进行特殊处理,处理逻辑如下:当条件表达式中的逻辑比较符为 >
、>=
、<
、<=
、=
、<>
、like
,VSQL将会替换参数中值为空字串的表达式(当表达式里有函数除外),如:
例1:参数param1值为空字串的特殊处理
select a1 from a where a2 = :param1 and a3=2
# 处理成
select a1 from a where (a2 IS NULL or a2 = :param1)
例2:参数param1值为空字串的特殊处理
select a1 from a where a2 like '%'||:param1||'%'
# 处理成
select a1 from a where (a2 IS NULL or a2 LIKE '%'||:param1||'%')
例3:如果出现在case when中也会替换,
select case when a1=:param1 and a2=2 then a1 else a2 end from a
# 处理成
select case when (a1 IS NULL or a1 = :param1) and a2 = 2 then a2 else a1 end from a
注意:如果条件表达式里面参数作为函数的参数,或者逻辑比较符为in的则不处理,如:
select a1 from a where a2 = isnull(:param1,1) and a3=2
select a1 from a where a2 in (:param1)
5. 对查询条件in参数的处理
VSQL将会自动对sql里查询条件in的参数值进行特殊处理,如:
select *
from a
where a1 in (:param1)
其中param1的值格式为逗号分隔的字符串(aaa,bbb,ccc)或者ListToString字符串或者字符串数组,都会自动处理成 in ('aaa','bbb','ccc')