在sql中执行insert语句之前或之后获取记录的插入id

问题描述 投票:2回答:3

我在我的DAO类中有这个方法将记录插入到一​​个名为idea的表中这是我的方法:

    public long  addIdea(AddIdeaDto addIdeaDto, int userId) {

    Connection connection = null;

    PreparedStatement preparedStatement = null;
    try {
        connection = getConnection();



        preparedStatement = connection.prepareStatement(
                "INSERT INTO IDEA ( IDEA.I_ID,IDEA.I_NO,IDEA.I_APPROVER_NAME_CODE, IDEA.I_TITLE,IDEA.I_DESCRIPITION, IDEA.I_CREATED_DATE,IDEA.I_STATUS_CODE, "
                        + "IDEA.I_IS_CODE, IDEA.I_CONTRIBUTION_CODE, IDEA.I_POSITIVE_IMPACT, IDEA.I_SECOND_MEMBER_ID,IDEA.I_THIRD_MEMBER_ID,IDEA.I_FOURTH_MEMBER_ID,"
                        + "IDEA.I_FIFTH_MEMBER_ID, IDEA.I_POINTS,IDEA.I_CREATED_USER_ID)"
                        + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");


        preparedStatement.executeQuery("SELECT IDEA_SEQ.nextval FROM DUAL");

        // Set parameters
        preparedStatement.setObject(1, Types.NUMERIC);
        preparedStatement.setObject(2, Types.NUMERIC);

        preparedStatement.setObject(3, addIdeaDto.getApproverNameCode());

        preparedStatement.setString(4, addIdeaDto.getTitle());

        preparedStatement.setString(5, addIdeaDto.getDescription());
        preparedStatement.setDate(6, addIdeaDto.getCreatedDate() == null ? null
                : new java.sql.Date(addIdeaDto.getCreatedDate().getTime()));

        preparedStatement.setObject(7, addIdeaDto.getStatusCode());
        preparedStatement.setObject(8, addIdeaDto.getIsNewCode());

        preparedStatement.setObject(9, addIdeaDto.getContributionCode());

        preparedStatement.setString(10, addIdeaDto.getPositiveImpact());
        preparedStatement.setObject(11, addIdeaDto.getSecondMemberName());
        preparedStatement.setObject(12, addIdeaDto.getThirdMemberName());
        preparedStatement.setObject(13, addIdeaDto.getFourthMemberName());
        preparedStatement.setObject(14, addIdeaDto.getFifthMemberName());

        preparedStatement.setObject(15, addIdeaDto.getPoints());
        preparedStatement.setInt(16, userId);

        preparedStatement.executeQuery();
        return addIdeaDto.getIdeaId();

    } catch (Exception e) {
        throw new RuntimeException(e);
    } finally {
        try {
            preparedStatement.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

实际上我想要的是插入语句之后或之前我想获取id(IDEA_SEQ.nextval)并将其保存在一个值中,以便将其用作插入anther表中的输入。

例如,我插入此记录:id = 1,no = 1,approver code = 2,title ='test'.............

我想要这个值id = 1来使用它来插入表A,A_id = 33,IDEA.I_ID = 1,A_name ='testing'

我怎么能以推进的方式实现它?

我根据收到的评论更新代码,但我没有实现

java sql oracle
3个回答
0
投票

通常,可以使用先前和单独的SQL查询来处理需要重用的ID

 previousPreparedStatement = connection.prepareStatement(
            "select IDEA_SEQ.nextval as nextval from dual");

根据传递给现有insert语句的列(intString)将结果保存为numbervarchar参数:

(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

另请注意answer from DBA forum

您将无法使用纯SQL来克服此限制:您将需要一些PL / SQL


0
投票

处理此问题的更好方法是使用RETURNING INTO子句,该子句使用单个原子语句:

INSERT INTO mytable (id, col1, col2)
VALUES ( seq_id.nextval, c1, c2 )
RETURNING id INTO myval;

0
投票

您可以使用PreparedStatement.getGeneratedKeys()来获取生成的值。没有必要使用单独的声明:

您也不能在INSERT语句的列列表中使用表名称为列名添加前缀。

String insert = 
     "INSERT INTO IDEA ( I_ID,I_NO,I_APPROVER_NAME_CODE, I_TITLE,I_DESCRIPITION, I_CREATED_DATE,I_STATUS_CODE, "
   + "I_IS_CODE, I_CONTRIBUTION_CODE, I_POSITIVE_IMPACT, I_SECOND_MEMBER_ID,I_THIRD_MEMBER_ID,I_FOURTH_MEMBER_ID,"
   + "I_FIFTH_MEMBER_ID, I_POINTS,I_CREATED_USER_ID)"
   + " VALUES (idea_seq.nextval,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";


preparedStatement = connection.prepareStatement(insertSql, new String[] {"I_ID"});
preparedStatement.setInt(1, ???); // don't know where the value for I_NO comes from
preparedStatement.setString(2, addIdeaDto.getApproverNameCode());
preparedStatement.setString(3, addIdeaDto.getTitle());
... other parameters
preparedStatement.executeUpdate();
ResultSet rs = preparedStatement.getGeneratedKeys();
long newId = -1;

if (rs.next()) {
  newId = rs.getLong("I_ID");
}

... use the NewId ...

new String[] {"I_ID"}调用的参数prepareStatement()告诉JDBC驱动程序返回该列的生成值。可以通过getGeneratedKeys()检索该值,该值返回一个ResultSet,每个插入行包含一行(在这种情况下恰好是一行)。然后可以使用通常的getLong()(或getInt())方法从ResultSet中提取ID值。

© www.soinside.com 2019 - 2024. All rights reserved.