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