项目使用mybatis,发现某一where变量超过某个长度时,就会报错,-302 22001,但是生成的额SQL拷贝出来到toad中执行却不会出现此问题。
更改DB2环境变量解决
1.环境变量DB2_DEFERRED_PREPARE_SEMANTICS
DB2_DEFERRED_PREPARE_SEMANTICS是另一个和DB2的Oracle兼容特性相关的环境变量,它用来控制诸如Java或者C#编写的应用程序兼容性。如下所示,将该变量值设为YES:
- db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
这样做有什么好处呢?我们知道,从DB2 V9.7开始引入了隐式类型映射,它支持应用程序的动态语句中出现未定义类型参数标注符(Untyped Parameter Markers),但是这样的动态语句会在准备阶段报错。通过将db2set DB2_DEFERRED_PREPARE_SEMANTICS设置为YES,能避免在准备阶段求值,从而在执行阶段进行动态参数绑定,这为应用程序提供了动态绑定能力。
参考:http://book.51cto.com/art/201112/310691.htm
C:\UsersAdministrator>db2 ? sql-302
SQL0302N EXECUTE 或 OPEN 语句中主变量的值超出了其相应的使用范围。
说明:
发现输入主变量的值对于其在 SELECT、VALUES 或预编译语句中的使用而言已超
出了范围。
发生了下列情况之一:
* SQL 语句中使用的相应主变量或参数标记被定义为字符串,但是输入主变量包
含的字符串太长。
* SQL 语句中使用的相应主变量或参数标记被定义为数字,但是输入主变量包含
的数值超出了范围。
* C 语言以 NUL 终止的字符串主变量中丢失终止字符 NUL。
* 联合系统用户:在传递会话中,可能违反了特定于数据源的限制。
由于在 EXECUTE 或 OPEN 语句上的 SQLDA 中指定了不正确的主变量或不正确的
SQLLEN 值,因此发生此错误。
无法处理该语句。
用户响应:
确保输入主变量值的类型和长度正确。
如果输入主变量向参数标记提供值,那么使这些值与参数标记的隐含数据类型和
长度相匹配。
联合系统用户:对于传递会话,请确定哪个数据源导致该错误(参阅《故障诊断
指南》以了解标识失败的数据源所要遵循的过程)。
检查该数据源的 SQL 方言以确定违反了哪个特定限制,并根据需要来调整失败的
语句。
sqlcode:-302
sqlstate:22001, 22003
C:\Users\Administrator>db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
C:\Users\Administrator>db2set
DB2_DEFERRED_PREPARE_SEMANTICS=YES
DB2INSTOWNER=JIUWEI-PC
DB2PORTRANGE=60000:60003
DB2INSTPROF=C:\PROGRAMDATA\IBM\DB2\DB2COPY1
DB2COMM=TCPIP