浏览 4723 次
锁定老帖子 主题:java在db2的函数使用占位参数会有异常
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-12-01
select locate(?, dwdm, 1) as p from ca_company 其中 ? 是 java里面参数占位符的写法 , ? 处的参数我是传String类型的变量. Java代码:[ String sql = select locate(?, dwdm, 1) as p from ca_company; pstmt = createConnect().prepareStatement(sql); pstmt.setString(1, "35"); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { System.out.println(rs.getString(1)); } ] 这是异常信息: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [select LOCATE(?,dwdm,1) as p from ca_company]; nested exception is COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL0418N 在语句中使用了无效的参数标记。 SQLSTATE=42610 Caused by: COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL0418N 在语句中使用了无效的参数标记。 SQLSTATE=42610 如果改成 : select locate(cast( ? as varchar(10)) , dwdm , 1) as p from ca_company 这样执行就不会出现错误. 那么看来应该是类型的问题,因为cast成varchar后就不会出错了,虽然我传的变量类型就是string.. 我想询问的是: 1、用prepareStatement来解析执行sql的时候,发送给数据库的sql语句是什么样的,仍是带?参数的? 还是转成数据库特有的绑定参数的sql语句的写法?比如oracle就转成 &variableName 这样: select * from ca_company where dwdm = &dwdm; 否则,数据库是怎么样知道要执行的是绑定变量的sql语句? 2、我已经设了绑定变量的类型是string,为什么还要cast 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-12-01
一般使用?是放在where条件中的
|
|
返回顶楼 | |
发表时间:2006-12-01
请看一下
“oracle的JDBC使用preparedStatement处理char类型字段的问题” http://together.iteye.com/blog/28035 db2的这个问题看起来和oracle的一样,都是jdbc驱动本身的问题。 字段类型改为varchar就没问题了。 |
|
返回顶楼 | |
发表时间:2006-12-06
谢谢你们的回复。但是问题不是像楼上说的那样。因为不放在函数里的占位符不会有任何问题。比如 where dwdm = ? 是不会错的。另外db2 app和jcc的都试过了,不行。
我们现在就是对函数里的占位符全部都做cast。 |
|
返回顶楼 | |