ojdbc8 - El método ExecuteBatch devuelve una matriz de valor-2 en java
oracle jdbc maven (4)
Cuando estoy ejecutando el método executeBatch en java, está devolviendo una matriz int que está bien pero el valor es -2 de todos los elementos de la matriz,
debe ser 0 o + ve número que muestra el número de filas afectadas, pero su retorno es de -2,
cuando lo verifiqué en la base de datos, todas las actualizaciones se realizaron con éxito. por favor, explica cuál es el significado de este -2 y cómo encuentro el número de filas afectadas.
Gracias, Deepesh Uniyal
Un valor de -2 indica que un elemento se procesó con éxito, pero que el número de filas afectadas es desconocido.
Actualización estándar de lotes ...
conn.setAutoCommit(false);
PreparedStatement pstmt =
conn.prepareStatement("INSERT INTO employees VALUES(?, ?)");
pstmt.setInt(1, 2000);
pstmt.setString(2, "Milo Mumford");
pstmt.addBatch();
pstmt.setInt(1, 3000);
pstmt.setString(2, "Sulu Simpson");
pstmt.addBatch();
int[] updateCounts = pstmt.executeBatch();
conn.commit();
pstmt.close();
...
Puede procesar la matriz de recuentos de actualizaciones para determinar si el lote se procesó correctamente.
Manejo de errores en la implementación de Oracle de procesamiento por lotes estándar
Si alguna de las operaciones por lotes no se completa con éxito o intenta devolver un conjunto de resultados durante una llamada executeBatch, el procesamiento se detiene y se genera una excepción java.sql.BatchUpdateException.
Después de una excepción por lotes, la matriz de recuentos de actualizaciones se puede recuperar utilizando el método getUpdateCounts del objeto BatchUpdateException. Esto devuelve una matriz int de recuentos de actualizaciones, al igual que el método executeBatch. En la implementación de Oracle de los lotes de actualización estándar, el contenido de la matriz de recuentos de actualizaciones es el siguiente, después de que se procesa un lote:
Para un lote de instrucciones preparadas, en caso de un error entre la ejecución del lote, el método executeBatch no puede devolver un valor, en su lugar lanza una excepción BatchUpdateException. En este caso, la excepción en sí misma lleva una matriz int de tamaño n como sus datos, donde n es el número de ejecuciones de registros exitosas. Por ejemplo, si el lote es de tamaño 5 y el error se produce en el cuarto registro, la excepción BatchUpdateException tiene una matriz de tamaño 3 (3 registros ejecutados con éxito) y cada elemento de la matriz representa cuántas filas se vieron afectadas por cada uno de ellos .
Para un lote de sentencias genéricas o un lote de sentencias reclamables, la matriz de recuentos de actualizaciones es solo una matriz parcial que contiene la actualización real
Cuenta hasta el punto del error. Los recuentos de actualizaciones reales se pueden proporcionar porque Oracle JDBC no puede usar lotes verdaderos para declaraciones genéricas y que se pueden llamar en la implementación de Oracle de la actualización estándar
procesamiento por lotes
Por ejemplo, si hubo 20 operaciones en el lote, las primeras 13 tuvieron éxito y la 14 generó una excepción, entonces la matriz de conteos de actualización tendrá 13 elementos, que contienen los conteos de actualización reales de las operaciones exitosas.
Puede confirmar o revertir las operaciones exitosas en esta situación, como prefiera.
En su código, después de un procesamiento fallido de un lote, debe estar preparado para manejar los recuentos de actualizaciones -3 o verdaderas en los elementos de la matriz cuando se produce una excepción. Para un procesamiento por lotes fallido, tendrá una matriz completa de -3 o una matriz parcial de enteros positivos.
La especificación jdbc tiene lo siguiente que decir sobre el código de retorno de las actualizaciones por lotes:
■ 0 o mayor: el comando se procesó con éxito y el valor es un recuento de actualizaciones que indica el número de filas en la base de datos que se vieron afectadas por la ejecución del comando.
■ Statement.SUCCESS_NO_INFO: el comando se procesó correctamente, pero el número de filas afectadas es desconocido
Statement.SUCCESS_NO_INFO se define como -2, por lo que su resultado dice que todo funcionó bien, pero no obtendrá información sobre el número de columnas actualizadas.
La documentación del oráculo declara:
• Para un lote de instrucciones preparado, no es posible conocer el número de filas afectadas en la base de datos por cada instrucción individual en el lote. Por lo tanto, todos los elementos de la matriz tienen un valor de -2. De acuerdo con la especificación JDBC 2.0, un valor de -2 indica que la operación se realizó correctamente, pero se desconoce el número de filas afectadas.
• Para un lote de sentencias genéricas, la matriz contiene los recuentos de actualizaciones reales que indican el número de filas afectadas por cada operación. Los recuentos de actualizaciones reales solo se pueden proporcionar en el caso de declaraciones genéricas en la implementación de Oracle de procesamiento por lotes estándar.
• Para un lote de instrucciones invocables, el servidor siempre devuelve el valor 1 como el recuento de actualizaciones, independientemente de las filas de números afectadas por cada operación.
Por lo tanto, parece que si necesita los recuentos de actualizaciones, no puede usar PreparedStatement
s, pero tiene que recurrir a los Statement
simples.
Tenga en cuenta que desde Oracle 12c este ya no debería ser el caso:
Para un lote de instrucciones preparado, la matriz contiene los recuentos de actualizaciones reales que indican el número de filas afectadas por cada operación.
Consulte https://docs.oracle.com/database/121/JJDBC/oraperf.htm#JJDBC28773