Получить вставленный идентификатор записи до или после выполнения оператора вставки в SQL - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть этот метод в моем классе 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);
        }
    }
}

На самом деле я хочу получить после или перед оператором вставки. Я хочу получить идентификатор (IDEA_SEQ.nextval) и сохранить его в значении, чтобы использовать его в качестве входных данных для вставки в другую таблицу.

Например, я вставляю эту запись: id = 1, no = 1, код утверждающего = 2, title = 'test' .............

Я хочу, чтобы это значение id = 1 использовалось для вставки в таблицу A, A_id = 33, IDEA.I_ID = 1, A_name = 'testing'

как я могу достичь этого в лучшую сторону?

Я обновляю код на основе комментариев, которые я получаю, но я не достиг этого

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Лучший способ справиться с этим - это предложение RETURNING INTO, в котором используется один атомарный оператор:

INSERT INTO mytable (id, col1, col2)
VALUES ( seq_id.nextval, c1, c2 )
RETURNING id INTO myval;
0 голосов
/ 05 ноября 2018

Вы можете использовать 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, который содержит одну строку для каждой вставленной строки (в данном случае именно такую). Затем значение идентификатора можно извлечь из ResultSet с помощью обычных методов getLong() (или getInt()).

0 голосов
/ 04 ноября 2018

Обычно ID, который необходимо использовать повторно, может обрабатываться с использованием предыдущего и отдельного запроса SQL

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

Результат сохранен как параметр int или String в соответствии со столбцом (number или varchar), который передается в существующий оператор вставки:

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

Обратите внимание также на ответ с форума DBA

вы не сможете использовать простой SQL для преодоления этого ограничения: вам понадобится немного PL / SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...