【问题标题】:java getting SQL next sequence number of the record before insertionjava在插入之前获取SQL下一个记录的序列号
【发布时间】:2013-08-02 20:48:51
【问题描述】:

我的 java 代码中有 TestingID 变量和一个 sql 字符串,如下所示。 sql 字符串稍后将用于prepareStatement。

 int TestingID; 

 String sqlInsert = "INSERT INTO TESTING VALUES(TESTING_SEQ.NEXTVAL, ?, ?)";  
 ...  

 MethodA(TestingID);     //passing TestingID to MethodA

我需要将新插入的记录的下一个序列值获取到TestingID中,这样我就可以在上面显示的另一种方法中使用它。

【问题讨论】:

    标签: java sql oracle variable-assignment sequence


    【解决方案1】:

    通过使用这种方法,您应该首先查询新的身份值(我看到您正在使用序列)。这可以通过发出一个选择来完成。

    // This example is for Oracle
    
    String sqlIdentifier = "select TESTING_SEQ.NEXTVAL from dual";
    PreparedStatement pst = conn.prepareStatement(sqlIdentifier);
    synchronized( this ) {
       ResultSet rs = pst.executeQuery();
       if(rs.next())
         long myId = rs.getLong(1);
    

    之后,将其作为参数传递给preparedStatement。

    ...
    String sqlInsert = "INSERT INTO TESTING VALUES(?, ?, ?)";
    PreparedStatement pst = conn.prepareStaetment(sqlInsert);
    pst.setLong(1, myId);
    ...
    

    从那时起,您将永远拥有您的序列号。

    这些不是功能性示例(没有 catch 或 finally 等),但会让您了解如何做;)

    【讨论】:

    • 可能有一种方法可以通过使用returning into 语法来避免额外的select。
    • 当然,但我提供了一个使用 oracle 语法的通用方法作为一个实际示例。 RETURN INTO 不适用于 SQL Server,因为您必须使用存储过程来执行相同的操作,并使用 CallableStatement 来注册 out 参数。对于 DB2,您可以只对 SYSIBM.SYSDUMMY1 执行 SELECT,等等...
    【解决方案2】:

    在 spring 和 Oracle 数据库中,这应该可以工作。

    public Long getSequence() {
      org.springframework.jdbc.core.JdbcTemplate jdbcTemplateObject = new JdbcTemplate(dataSource);
      Long seq;
      String sql = "select SEQ_XY.NEXTVAL from dual";
      seq = jdbcTemplateObject.queryForObject(sql, new Object[] {}, Long.class);
      return seq;
    }
    

    【讨论】:

      【解决方案3】:

      在Oracle中你可以使用

      long myId = rs.getLong("NEXTVAL");
      

      这对于 HSQL 将失败。 可以修改sql语句,添加“as NEXTVAL”。

      String sqlIdentifier = "select TESTING_SEQ.NEXTVAL as NEXTVAL from dual";
      

      【讨论】:

        【解决方案4】:

        按照以下步骤操作:

                         1) create sequence in database by using the following query.
        CREATE SEQUENCE sequence_name
        [START WITH start_num]
        [INCREMENT BY increment_num]
        [ { MAXVALUE maximum_num | NOMAXVALUE } ]
        [ { MINVALUE minimum_num | NOMINVALUE } ]
        [ { CYCLE | NOCYCLE } ]
        [ { CACHE cache_num | NOCACHE } ]
        [ { ORDER | NOORDER } ];
        

        示例:

        CREATE SEQUENCE customers_seq
         START WITH     1000
         INCREMENT BY   1
         NOCACHE
         NOCYCLE;
        

        2) 检查序列是否创建成功。 通过执行命令:

                               select * from user_sequences;
        

        检查名称“customers_seq”

        3) 运行查询:

        示例程序:

        Statement stmt= connection.createStatement();
        
        ResultSet rs = stmt.executeQuery("SELECT customers_seq.NEXTVAL FROM dual");
        
        if ( rs!=null && rs.next() ) {
         int cust_id = rs.getInt(1);
        sysout(cust_id);
        rs.close();
        }
        
        stmt.close(); 
        con.close();
        

        【讨论】:

          猜你喜欢
          • 2014-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多