论坛首页 入门技术论坛

java在db2的函数使用占位参数会有异常

浏览 4723 次
该帖已经被评为新手帖
作者 正文
   发表时间:2006-12-01  
DAO
我们使用db2 app的驱动,执行这样的sql语句会出错:

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
   发表时间:2006-12-01  
一般使用?是放在where条件中的
0 请登录后投票
   发表时间:2006-12-01  
请看一下
“oracle的JDBC使用preparedStatement处理char类型字段的问题”
http://together.iteye.com/blog/28035
db2的这个问题看起来和oracle的一样,都是jdbc驱动本身的问题。
字段类型改为varchar就没问题了。
0 请登录后投票
   发表时间:2006-12-06  
谢谢你们的回复。但是问题不是像楼上说的那样。因为不放在函数里的占位符不会有任何问题。比如 where dwdm = ? 是不会错的。另外db2 app和jcc的都试过了,不行。
我们现在就是对函数里的占位符全部都做cast。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics