Skip to main content

语法问题处理

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方法字段参数中使用了casewhen语法,在外层再使用to_char方法将返回错误信息,这时要使用to_char函数内部先转成字符,涉及的函数主要是datadiff函数,由于vsql未提供to_dateto_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')