论坛首页 Java企业应用论坛

db2的jdbc不支持在sql的函数中带"?"吗?

浏览 7349 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-03-09  
DAO
我也是刚发现,问题出现在我在做oracle到db2的移植中,比如:
try {
            String sql = "UPDATE testTable T SET T.CODE= ? || SUBSTR(T.CODE,LENGTH(?)+1 ,LENGTH(T.CODE)) WHERE T.CODE LIKE ?";
            Class.forName("com.ibm.db2.jcc.DB2Driver");
            Connection con = DriverManager.getConnection(
                    "jdbc:db2://192.168.30.211:50000/test", "test",
                    "test");

            PreparedStatement stmt = con.prepareStatement(sql);
            
            stmt.setString(1,"1");
            stmt.setString(2,"123");
            stmt.setString(3,"23434535635");
            stmt.executeUpdate();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

会出现如下错误:
com.ibm.db2.jcc.c.SqlException: DB2 SQL error: SQLCODE: -418, SQLSTATE: 42610, SQLERRMC: null
	at com.ibm.db2.jcc.c.cl.e(cl.java:1213)
	at com.ibm.db2.jcc.c.cl.a(cl.java:931)
	at com.ibm.db2.jcc.a.bd.g(bd.java:121)
	at com.ibm.db2.jcc.a.bd.a(bd.java:42)
	at com.ibm.db2.jcc.a.r.a(r.java:31)
	at com.ibm.db2.jcc.a.bp.g(bp.java:103)
	at com.ibm.db2.jcc.c.cl.g(cl.java:915)
	at com.ibm.db2.jcc.c.cm.J(cm.java:1285)
	at com.ibm.db2.jcc.c.cm.c(cm.java:1632)
	at com.ibm.db2.jcc.c.cm.C(cm.java:328)
	at com.ibm.db2.jcc.c.cm.executeUpdate(cm.java:311)


原因是用了length(?),也就是函数中有"?",请问别人也有遇到过吗?如果是真的,以后写sql时得小心移植问题了.
   发表时间:2007-03-09  
说不定是不支持Length()函数,查查是否DB2中是另一个函数名?
0 请登录后投票
   发表时间:2007-03-09  
查查db2手册里
SQLCODE: -418, SQLSTATE: 42610
是什么错误
0 请登录后投票
   发表时间:2007-03-09  
查了一下DB2支持length()函数的。
Google一把,42610 :不允许参数标记。
看来楼主是对的。
建议你看看有没有新版本的DB2及JDBC驱动。
0 请登录后投票
   发表时间:2007-03-09  
不会吧,还有这种情况
0 请登录后投票
   发表时间:2007-03-09  
ibm db2 就是有些问题 换种方式吧
0 请登录后投票
   发表时间:2007-03-09  
不同操作系统下的db2,sql语句写法还有差异 查下参考手册吧
0 请登录后投票
   发表时间:2007-06-06  
问题知道怎么回事了,一直没想起来回帖,其实早就解决了,不好意思。

原因很简单,db2要求?也是要有类型的,如果你用了函数,就必须用cast把?的类型明确的告诉给db2的函数才行,oracle是不需要的
0 请登录后投票
   发表时间:2007-06-08  
原来是这样,db2还是有些独特啊,一直用oracle根本不会注意到。
0 请登录后投票
论坛首页 Java企业应用版

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