sql >> Database >  >> RDS >> Oracle

PLSQL JDBC:Hoe krijg ik de laatste rij-ID?

Normaal je zou Statement#getGeneratedKeys() . gebruiken hiervoor (zie ook dit antwoord voor een voorbeeld), maar dit wordt voor zover (nog) niet ondersteund door de Oracle JDBC driver.

Uw beste gok is om ofwel gebruik maken van CallableStatement met een RETURNING clausule:

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);
    // ...

Of fire SELECT sequencename.CURRVAL na INSERT in dezelfde transactie:

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();
    // ...


  1. fout, tekenreeks of binaire gegevens worden afgekapt bij een poging om in te voegen

  2. Aankondiging van ClusterControl 1.5 - met automatische back-upverificatie en cloud-upload

  3. SQL - Vind ontbrekende int-waarden in meestal geordende opeenvolgende reeksen

  4. Hoe TimescaleDB gemakkelijk te implementeren?