PLSQL JDBC: как получить идентификатор последней строки?

Что такое PLSQL (Oracle) эквивалент этого фрагмента SQL-сервера?

BEGIN TRAN
INSERT INTO mytable(content) VALUES ("test") -- assume there's an ID column that is autoincrement
SELECT @@IDENTITY
COMMIT TRAN

В C # вы можете вызвать myCommand.ExecuteScalar () для получения идентификатора новой строки.

Как я могу вставить новую строку в Oracle, и чтобы JDBC получил копию нового идентификатора?

РЕДАКТИРОВАТЬ: BalusC обеспечил очень хорошую отправную точку. По какой-то причине JDBC не нравится привязка именованных параметров. Это дает SQLException «Неправильно установленные или зарегистрированные параметры». Почему это происходит?

        OracleConnection conn = getAppConnection();
        String q = "BEGIN INSERT INTO tb (id) values (claim_seq.nextval) returning id into :newId; end;" ;
        CallableStatement cs = (OracleCallableStatement) conn.prepareCall(q);
        cs.registerOutParameter("newId", OracleTypes.NUMBER);
        cs.execute();
        int newId = cs.getInt("newId");
18
задан BalusC 24 August 2010 в 13:01
поделиться

2 ответа

Обычно для этого используется Заявление # getGeneratedKeys () (см. Также этот ответ для примера), но это пока (все еще) не поддерживается драйвер Oracle JDBC.

Лучше всего либо использовать CallableStatement с предложением RETURNING :

String sql = "BEGIN INSERT INTO mytable(id, content) VALUES (seq_mytable.NEXTVAL(), ?) RETURNING id INTO ?; END;";

Connection connection = null;
CallableStatement statement = null;

try {
    connection = database.getConnection();
    statement = connection.prepareCall(sql);
    statement.setString(1, "test");
    statement.registerOutParameter(2, Types.NUMERIC);
    statement.execute();
    int id = statement.getInt(2);
    // ...

, либо активировать SELECT имя последовательности. CURRVAL после INSERT в той же транзакции:

String sql_insert = "INSERT INTO mytable(content) VALUES (?)";
String sql_currval = "SELECT seq_mytable.CURRVAL FROM dual";

Connection connection = null;
PreparedStatement statement = null;
Statement currvalStatement = null;
ResultSet currvalResultSet = null;

try {
    connection = database.getConnection();
    connection.setAutoCommit(false);
    statement = connection.prepareStatement(sql_insert);
    statement.setString(1, "test");
    statement.executeUpdate();
    currvalStatement = connection.createStatement();
    currvalResultSet = currvalStatement.executeQuery(sql_currval);
    if (currvalResultSet.next()) {
        int id = currvalResultSet.getInt(1);
    }
    connection.commit();
    // ...
34
ответ дан 30 November 2019 в 06:50
поделиться

Вы можете использовать предложение Oracle , возвращающее .

insert into mytable(content) values ('test') returning your_id into :var;

Посмотрите по этой ссылке , чтобы увидеть образец кода. Вам потребуется Oracle 10g или новее и новая версия драйвера JDBC.

8
ответ дан 30 November 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: