代码如:
conn=DBConn.getConn();
pst=conn.prepareStatement(sb.toString());
pst.setString(1, gp.getServiceID());
pst.setString(2, gp.getServiceUrl());
pst.setString(3, gp.getReadme());
pst.setString(4, gp.getVersions());
pst.setString(5, "1");
pst.setString(6, "");
pst.setTimestamp(7, new Timestamp(System.currentTimeMillis()));
i = pst.executeUpdate();
rs = pst.getGeneratedKeys();
if (rs != null&&rs.next()) {
return rs.getInt(1);
}
我是想插入数据库后获取该数据的id,原来在MySql上是问题的,迁移到了Oracle之后就报错了,错误如下,高手看下:java.sql.SQLException: 不允许的操作
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
at oracle.jdbc.driver.OracleStatement.getGeneratedKeys(OracleStatement.java:4563)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.logicalcobwebs.proxool.ProxyStatement.invoke(ProxyStatement.java:100)
at org.logicalcobwebs.proxool.ProxyStatement.intercept(ProxyStatement.java:57)
at oracle.jdbc.OracleStatement$$EnhancerByProxool$$f76e3bca.getGeneratedKeys(<generated>)
at com.ourpalm.mis.newbilling.content.dao.ContentDao.insertPreReId(ContentDao.java:509)
at com.ourpalm.mis.newbilling.content.service.ContentService.listsheetVideo(ContentService.java:904)
at com.ourpalm.mis.newbilling.content.service.ContentService.listFile(ContentService.java:91)
at com.ourpalm.mis.newbilling.content.servlet.ContentServlet.ZipUpLoad(ContentServlet.java:117)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.ourpalm.mis.common.util.BaseServlet.doGet(BaseServlet.java:40)
at com.ourpalm.mis.common.util.BaseServlet.doPost(BaseServlet.java:66)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.ourpalm.mis.common.util.FilterServlet.doFilter(FilterServlet.java:25)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.ourpalm.mis.common.util.FilterServlet.doFilter(FilterServlet.java:25)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)

解决方案 »

  1.   

    补充下,上面是执行到rs = pst.getGeneratedKeys();这报错的。
      

  2.   

    网上说,对于ORACLE JDBC,只有在10.2.0.1.0版本后的JDBC才支持getGeneratedKeys特性,那怎么才能有效的获取其id呢,本人现在只用servlet,怎么获取,大家帮下忙,感谢。
      

  3.   

    你的serviceID字段有设置为  AUTO_INCREMENT吗, 
      

  4.   

    getGeneratedKeys()是自动获取主键。请问rs.getInt(1);获取的确认是主键么
      

  5.   

    oracle是没有自动增长属性的,需要用sequence
      

  6.   

    问题解决了,的确10.2.0.1.0版本后的JDBC才支持getGeneratedKeys特性,所以低版本的要用别的办法。
    自增字段:  表atable(id,a) id需要自增 首先建立一个序列:  create sequence seq_atable minvalue 1 maxvalue 999999999999999999 start with 1 increment by 1 nocache  有二种方式使用自增字段:  使用序列+触发器实现自增,插入语句不需要管自增字段  如:create or replace trigger trg_atable before insert on atable for each row begin select seq_atable.nextval into :new.id from dual; end;  插入数据:insert into atable(a) values('test');  注:我创建了sequence 和trigger :,之后在procedure中插入数据,插入的时候没有管ID字段,在应用中,使用了hibernate,虽然hibernate在增加记录的时候也会处理ID,但是添加记录之后,查询记录发现,ID还是根据序列和触发器的规则设置的  仅使用序列,需要在插入数据时,自增字段插入序列下一个值  如:insert into atable(id,a) values(seq_atable.nextval,'test');  三、返回刚插入记录的自增字段值  如上面的例子,我们插入一条记录后,我想马上返回刚插入的记录的ID号,我该怎么处理呢?  首先要解决自增字段的问题,上面的二种方法哪种更适合这种用法呢? 建议使用第二种自增序列,否则处理起这个问题来比较麻烦。  使用自增字段的第二种方法,在插入一条记录后马上执行一下下面的语句即返回当前插入数据的ID。  $query="select seq_atable.currval from dual";  seq_atable.currval 的值只有在同一次会话中,发生seq_atable.nextval后有效:) 所以不会存在取错值的问题。