es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

imagen de la descripción

No encuentro el problema de la consulta, ¿alguien tiene la solución para resolver esto?

Tags:  , , ,

Answer

  1. Avatar for 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:

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

    Una vez realizada esta corrección, el error debería resolverse.

Comments are closed.