stored procedimientos procedimiento namedstoredprocedurequery llamar how example desde almacenados almacenado java oracle jdbc plsql

procedimientos - procedimiento almacenado java sql server



PLSQL JDBC: ¿Cómo obtener la última fila de identificación? (3)

¿Cuál es el equivalente PLSQL (Oracle) de este fragmento de servidor SQL?

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

En C #, puede llamar a myCommand.ExecuteScalar () para recuperar el ID de la nueva fila.

¿Cómo puedo insertar una nueva fila en Oracle y hacer que JDBC obtenga una copia de la nueva identificación?

EDITAR: BalusC proporcionó un muy buen punto de partida. Por algún motivo, a JDBC no le gusta el enlace de los parámetros nombrados. Esto proporciona SQLException "Parámetros registrados o configurados incorrectamente". ¿Por qué está pasando esto?

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");


Puede usar la cláusula de retorno de Oracle.

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

Consulte este enlace para obtener una muestra de código. Necesita Oracle 10g o posterior, y una nueva versión del controlador JDBC.


Puede usar getGeneratedKeys (), seleccionando explícitamente el campo clave. Aquí hay un fragmento:

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

consulte los detalles: http://docs.oracle.com/cd/E16655_01/java.121/e17657/jdbcvers.htm#CHDEGDHJ


Normalmente , utilizaría Statement#getGeneratedKeys() para esto (consulte también esta respuesta para ver un ejemplo), pero esto es tan lejos (todavía) no admitido por el controlador Oracle JDBC.

Su mejor CallableStatement es hacer uso de CallableStatement con una cláusula de 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); // ...

O seleccione SELECT sequencename.CURRVAL después de INSERT en la misma transacción:

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