PLSQL JDBC: Comment obtenir le dernier identifiant de ligne?

Qu’est-ce que PLSQL (Oracle) équivalent de cet extrait de serveur SQL?

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

En C #, vous pouvez appeler myCommand.ExecuteScalar () pour récupérer l’ID de la nouvelle ligne.

Comment puis-je insérer une nouvelle ligne dans Oracle et permettre à JDBC d’obtenir une copie du nouvel identifiant?

EDIT: BalusC a fourni un très bon sharepoint départ. Pour une raison quelconque, JDBC n’aime pas la liaison de parameters nommés. Cela donne SQLException “Paramètres mal définis ou enregistrés”. Pourquoi cela arrive-t-il?

  OracleConnection conn = getAppConnection(); Ssortingng 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"); 

Normalement, vous utiliseriez Statement#getGeneratedKeys() pour cela (voir également cette réponse pour un exemple), mais cela n’est pas (encore) pris en charge par le pilote JDBC Oracle.

Le mieux est de faire appel à CallableStatement avec une clause RETURNING :

 Ssortingng 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.setSsortingng(1, "test"); statement.registerOutParameter(2, Types.NUMERIC); statement.execute(); int id = statement.getInt(2); // ... 

Ou lancez SELECT sequencename.CURRVAL après INSERT dans la même transaction:

 Ssortingng sql_insert = "INSERT INTO mytable(content) VALUES (?)"; Ssortingng 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.setSsortingng(1, "test"); statement.executeUpdate(); currvalStatement = connection.createStatement(); currvalResultSet = currvalStatement.executeQuery(sql_currval); if (currvalResultSet.next()) { int id = currvalResultSet.getInt(1); } connection.commit(); // ... 

Vous pouvez utiliser la clause de retour d’Oracle.

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

Consultez ce lien pour un exemple de code. Vous avez besoin d’Oracle 10g ou version ultérieure et d’une nouvelle version du pilote JDBC.

Vous pouvez utiliser getGeneratedKeys () en sélectionnant explicitement le champ clé. Voici un extrait:

  // change the ssortingng to your connection ssortingng Connection connection = DriverManager.getConnection("connection ssortingng"); // assume that the field "id" is PK, and PK-sortinggger exists Ssortingng sql = "insert into my_table(id) values (default)"; // you can select key field by field index int[] colIdxes = { 1 }; // or by field name Ssortingng[] 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); } } } 

Pour plus d'informations, reportez-vous à l' adresse http://docs.oracle.com/cd/E16655_01/java.121/e17657/jdbcvers.htm#CHDEGDHJ