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

java oracle jdbc plsql

10349 просмотра

3 ответа

Что такое 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");
Автор: Haoest Источник Размещён: 12.11.2019 09:38

Ответы (3)


33 плюса

Решение

Обычно вы используете Statement#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 sequencename.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();
    // ...
Автор: BalusC Размещён: 23.08.2010 11:01

8 плюса

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

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

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

Автор: Pablo Santa Cruz Размещён: 23.08.2010 10:48

2 плюса

Вы можете использовать getGeneratedKeys (), явно выбрав ключевое поле. Вот фрагмент:

    // change the string to your connection string
    Connection connection = DriverManager.getConnection("connection string");

    // assume that the field "id" is PK, and PK-trigger exists 
    String sql = "insert into my_table(id) values (default)";
    // you can select key field by field index
    int[] colIdxes = { 1 };
    // or by field name
    String[] colNames = { "id" };

    // Java 1.7 syntax; try-finally for older versions
    try (PreparedStatement preparedStatement = connection.prepareStatement(sql, colNames))
    {
        // note: oracle JDBC driver do not support auto-generated key feature with batch update
        //          // insert 5 rows
        //          for (int i = 0; i < 5; i++)
        //          {
        //              preparedStatement.addBatch();
        //          }
        //          
        //          int[] batch = preparedStatement.executeBatch();
        preparedStatement.executeUpdate();

        // get generated keys
        try (ResultSet resultSet = preparedStatement.getGeneratedKeys())
        {
            while (resultSet.next())
            {
                // assume that the key's type is BIGINT
                long id = resultSet.getLong(1);
                assertTrue(id != 0);

                System.out.println(id);
            }
        }
    }

обратитесь за подробностями: http://docs.oracle.com/cd/E16655_01/java.121/e17657/jdbcvers.htm#CHDEGDHJ

Автор: finejustice Размещён: 22.11.2013 05:24
Вопросы из категории :
32x32