JDBC con modo H2 y MySQL: la creación del procedimiento falla.
Descripción del código
Conexión a la base de datos
Intento almacenar un objeto de Java en una base de datos local sin utilizar una base de datos externa.
Para esto, utilizo JDBC con H2 a través de Hibernate:
Java
/**
* @param connection la conexión que se desea establecer
*/
public static void setConnectionHibernate() {
Properties connectionProps = new Properties();
connectionProps.put("user", "sa");
try {
Class.forName("org.h2.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
url = "jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MODE=MySQL;";
}
Consulta
Almaceno el PROCEDURE en un String con este código:
Java
static final String CREATE_PROCEDURE_INITPSEUDOS = "CREATE OR REPLACE PROCEDURE init_pseudos (MaxPseudo INT) BEGIN WHILE MaxPseudo >= 0 DO"
+
" INSERT INTO Pseudos (indexPseudo)" +
" VALUES (MaxPseudo);" +
" SET MaxPseudo = MaxPseudo - 1;" +
" END WHILE;" +
" END init_pseudos;";
Ejecución de la consulta
Y ejecuto la sentencia con este código:
Java
public static void initBaseDonneePseudos() {
try (Connection connection = DriverManager.getConnection(url, connectionProps);
Statement stmt = connection.createStatement()) {
stmt.execute(RequetesSQL.CREATE_TABLE_PSEUDOS);
stmt.execute(RequetesSQL.CREATE_PROCEDURE_INITPSEUDOS);
stmt.execute(RequetesSQL.CREATE_FUNCTION_RECUPEREPSEUDO);
stmt.execute(RequetesSQL.INIT_TABLE_PSEUDOS);
} catch (SQLException e) {
e.printStackTrace();
}
}
Problema
Prueba
Ejecuto esta prueba para probar la sentencia:
@Nested
class BaseDonneeInteractionTest {
<pre><code> @BeforeEach
public void setUp() {
BaseDonnee.setConnectionHibernate();
}
@Test
void testInitBaseDonnee() {
assertDoesNotThrow(() -> BaseDonnee.initBaseDonneePseudos());
}
}
</code></pre>
Error
Pero obtengo este error:
No encuentro el problema de la consulta, ¿alguien tiene la solución para resolver esto?
davy.ai
Parece que el error es causado por un error de sintaxis en la consulta CREATE PROCEDURE. Específicamente, el símbolo mayor que > debería ser reemplazado por el símbolo mayor o igual >= en la condición del bucle WHILE.
Aquí está la consulta corregida:
Una vez realizada esta corrección, el error debería resolverse.