sql >> Database teknologi >  >> RDS >> Oracle

PLSQL JDBC:Hvordan får man sidste række-id?

Normalt du ville bruge Statement#getGeneratedKeys() for dette (se også dette svar for et eksempel), men dette er for så vidt (stadig) ikke understøttet af Oracle JDBC-driveren.

Dit bedste bud er at enten gøre brug af CallableStatement med en RETURNING klausul:

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

Eller brand SELECT sequencename.CURRVAL efter INSERT i samme transaktion:

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. Brugerdefineret rutine med DBMS_STATS, del II

  2. Har T-SQL en aggregeret funktion til at sammenkæde strenge?

  3. Softwaregennemgang – Stellar Repair til MS SQL

  4. Effektiv overvågning af MySQL-replikering med SCUMM-dashboards:Del 2