Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

503
Views
JDBC con modo H2 y MySQL: el procedimiento de creación falla

Descripción del código

Conexión de base de datos

Intento almacenar el objeto Java en la base de datos localmente sin usar una base de datos externa. Para esto uso JDBC con H2 a través de Hibernate:

 /** * @param connection the connection to set */ 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

Guardo el PROCEDIMIENTO en String con este código:

 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 consultas

Y ejecuto la declaración con este código:

 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 declaración de prueba a prueba:

 @Nested class BaseDonneeInteractionTest { @BeforeEach public void setUp() { BaseDonnee.setConnectionHibernate(); } @Test void testInitBaseDonnee() { assertDoesNotThrow(() -> BaseDonnee.initBaseDonneePseudos()); } }

Error

pero me sale este error

ingrese la descripción de la imagen aquí

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

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

El problema es que en H2 no hay procedimientos o funciones explícitos como intentas definir.

Para ese propósito, H2 le permite crear funciones definidas usadas en su lugar. Por favor, considere leer la documentación correspondiente.

Básicamente, crea una función definida por el usuario declarando un ALIAS para un montón de código Java.

Por ejemplo, en su caso de uso, su CREATE_PROCEDURE_INITPSEUDOS podría verse similar a esto:

 CREATE ALIAS INIT_PSEUDOS AS $$ import java.sql.Connection; import java.sql.Statement; import java.sql.SQLException; @CODE void init_pseudos(final Connection conn, final int maxPseudo) throws SQLException { try (Statement stmt = conn.createStatement()) { while (maxPseudo >= 0) do { stmt.execute("INSERT INTO Pseudos (indexPseudo) VALUES (MaxPseudo);"); maxPseudo = maxPseudo - 1; } } } $$;

Tenga en cuenta lo siguiente:

  • Como dije, define una función definida por el usuario como código Java. Ese código Java debe estar encerrado entre dos delimitadores $$ .
  • Aunque incluí explícitamente algunas importaciones, puede usar cualquier clase en los paquetes java.util o java.sql en su código. Si desea incluir explícitamente algunas importaciones, o si necesita clases de otros paquetes además de los mencionados, las importaciones correspondientes deben proporcionarse justo después del primer token $$ . Además, debe incluir @CODE la señal H2 donde terminan sus importaciones y comienza su método Java real.
  • Si necesita una referencia a una Connection a la base de datos en su código, debería ser el primer argumento de su método.
  • Prefiere generar y no ocultar excepciones: permitirá que sus transacciones se comprometan o retrocedan en su conjunto de manera adecuada.

Puede invocar dicha función como de costumbre:

 CALL INIT_PSEUDOS (5);

Proporcione el valor apropiado para el argumento maxPseudo .

Por favor, considere el código provisto como solo un ejemplo de uso: puede mejorar el código de diferentes maneras, como usar PreparedStatement s en lugar de Statement s para fines de eficiencia, verificar los parámetros para la nulabilidad, etcétera.

over 4 years ago · Santiago Trujillo Report

0

El "Modo de compatibilidad de MySQL" no hace que H2 sea 100% compatible con MySQL. Solo cambia algunas cosas. La documentación los enumera:

  • Se permite crear índices en la declaración CREATE TABLE utilizando INDEX(..) o KEY(..). Ejemplo: crear prueba de tabla (id int clave principal, nombre varchar (255), clave idx_name (nombre));
  • Al convertir un número de punto flotante en un entero, los dígitos fraccionarios no se truncan, pero el valor se redondea.
  • ON DUPLICATE KEY UPDATE es compatible con declaraciones INSERT, debido a esta función, VALUES tiene un significado especial no estándar en algunos contextos.
  • INSERT IGNORE se admite parcialmente y se puede usar para omitir filas con claves duplicadas si no se especifica ON DUPLICATE KEY UPDATE.
  • REPLACE INTO es parcialmente compatible.
  • Los espacios se recortan del lado derecho de los valores CHAR.
  • REGEXP_REPLACE() usa \ para referencias anteriores.
  • Las funciones de valor de fecha y hora devuelven el mismo valor dentro de un comando.
  • Los literales 0x se analizan como literales de cadena binaria.
  • Se permiten expresiones no relacionadas en la cláusula ORDER BY de consultas DISTINCT.
  • Algunos comandos ALTER TABLE específicos de MySQL son parcialmente compatibles.
  • TRUNCATE TABLE reinicia los siguientes valores de las columnas generadas.
  • Si el valor de una columna de identidad se especificó manualmente, su secuencia se actualiza para generar valores después de la inserción.
  • El valor NULL funciona como el valor DEFAULT es asignaciones a columnas de identidad.
  • Las restricciones referenciales no requieren una clave principal existente o una restricción única en las columnas a las que se hace referencia y crean una restricción única automáticamente si dicha restricción no existe.
  • Se admiten las cláusulas LIMIT / OFFSET.
  • Se puede utilizar la cláusula AUTO_INCREMENT.
  • El tipo de datos YEAR se trata como el tipo de datos SMALLINT.
  • La cláusula GROUP BY puede contener posiciones basadas en 1 de expresiones de la lista SELECT.
  • Se permiten operadores de comparación no seguros entre valores numéricos y booleanos.

Eso es todo. No hay nada acerca de los procedimientos. Como señaló @jccampanero en la otra respuesta, debe usar la sintaxis específica de H2 si desea crear procedimientos almacenados.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!