免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5905 | 回复: 10
打印 上一主题 下一主题

请教Java中getUpdatecount方法总是返回-1的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-26 10:30 |只看该作者 |倒序浏览
RT

下面是我的表结构与存储过程代码:

SQL> desc tmp
名称                                      是否为空? 类型
----------------------------------------- -------- ----------------------------
ID                                                 NUMBER
VALUE                                              VARCHAR2(10)

SQL> select text from user_source where name='TMP_I';
TEXT
--------------------------------------------------------------------------------
procedure tmp_i
as
begin
delete from tmp;
for i in 1..10 loop
  insert into tmp values(i,chr(i+64));
end loop;
end;

SQL> select text from user_source where name='TMP_U';
TEXT
--------------------------------------------------------------------------------
procedure tmp_u(v_id tmp.id%type)
as
begin
update tmp set value = 'aa' where id=v_id;
end;

下面是我的Java代码:

import java.sql.* ;

public class dbtest {
  public static void main(String[] args) throws SQLException {
       String className,url,uid,pwd;
       className = "oracle.jdbc.driver.OracleDriver";
       url = "jdbc:oracle:thin:@192.168.1.8:1521:TBTDB";
       uid = "scott";
       pwd = "tbtscott2006";
       String sql="";
       int c=999;
       Connection conn=null;
       CallableStatement proc1 = null;
       CallableStatement proc2 = null;
       try
       {
           Class.forName(className);
            conn = DriverManager.getConnection(url,uid,pwd);
            proc1 = conn.prepareCall("{ call tmp_i() }");
            proc1.execute();
          proc1.close();
                  proc2 = conn.prepareCall("{ call tmp_u(?)}");
                  proc2.setInt(1,1);
           proc2.execute();
           c=proc2.getUpdateCount();
           proc2.close();
            System.out.println(c);
            System.out.println("OK");
        }
        catch (Exception e)
        {
                    e.printStackTrace();
            conn.rollback();
            System.out.println("ERROR");
            System.out.print(e.getMessage());
        }
        finally
        {
                    conn.close();
        }     
    }
}

执行没有什么问题,成功执行了Insert,也成功执行了Update,可变量 c 始终得到的值是 -1,但如果不是调用Procedure,而是直接用Java执行Update语句,变量 c 就可以得到正确的返回值。很是郁闷!

求问题原因或解决方法,万分感谢!

论坛徽章:
0
2 [报告]
发表于 2007-11-26 11:07 |只看该作者
你的proc也没有把update的行数传回来,为什么认为在java中调用的时候会取到呢?
试着修改一下你的tmp_u

论坛徽章:
0
3 [报告]
发表于 2007-11-26 11:51 |只看该作者
谢谢老版的回答!

请看下面的代码:

import java.sql.* ;

public class dbtest {

 public static void main(String[] args) throws SQLException {

        String className,url,uid,pwd;
        className = "oracle.jdbc.driver.OracleDriver";
        url = "jdbc:oracle:thin:@192.168.1.8:1521:TBTDB";
        uid = "scott";
        pwd = "tbtscott2006";
        String sql="";
        int c=999;
        Connection conn=null;
        CallableStatement proc1 = null;
        PreparedStatement sm = null;
        try
        {
            Class.forName(className);
            conn = DriverManager.getConnection(url,uid,pwd);
            proc1 = conn.prepareCall("{ call tmp_i() }");
            proc1.execute();
            proc1.close();
            sql="update tmp set value='aa' where id = ?";
            sm=conn.prepareStatement(sql);
            sm.setInt(1,1);
            c=sm.executeUpdate();
            sm.close();
            System.out.println(c);
            System.out.println("OK");
        }
        catch (Exception e)
        {
                e.printStackTrace();
        conn.rollback();
        System.out.println("ERROR");
        System.out.print(e.getMessage());
        }
        finally
        {
                conn.close();
        }

 }       

}

这样变量就可以得到Update影响到的行数啊。
为什么改为调用存储过程就不行呢?
在SQLServer中就可以,是不是Oracle里有什么开关参数要设置一下?

谢谢!

论坛徽章:
0
4 [报告]
发表于 2007-11-26 17:30 |只看该作者

论坛徽章:
0
5 [报告]
发表于 2007-11-27 09:35 |只看该作者
jdbc规范定义的就是DML(insert,delete,update)操作返回操作影响行数。
你的pl写的有问题。

论坛徽章:
0
6 [报告]
发表于 2007-11-27 09:55 |只看该作者
谢谢老版的回答!

那为什么SQLServer就可以呢?是数据库的关系吗?是Oracle的什么开关没打开?
谢谢!

论坛徽章:
0
7 [报告]
发表于 2007-11-27 11:25 |只看该作者
不是开关,oracle的procedule返回值要依赖于out型参数,具体写法自己搜一下。

论坛徽章:
0
8 [报告]
发表于 2007-11-27 13:42 |只看该作者
谢谢老版的回答!

那是不是说Oracle的Update存储过程就不能用getUpdateCount方法来获得该存储过程里Update语句所影响的记录数了?而一定要用OUT参数带出来了?
谢谢!

论坛徽章:
0
9 [报告]
发表于 2007-11-27 17:41 |只看该作者
有人跟我说这是一个Oracle的失误,要打上10gR2的补丁,或者试用Weblogic自带的一个驱动,主要是因为Oracle10gR2一开始没有实现这个功能。
看来要改程序了,真麻烦。

论坛徽章:
0
10 [报告]
发表于 2007-11-27 22:14 |只看该作者
这样啊,可以直接getUpdateCount得到吗,楼主确认后记得跟大家分享一下~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP