Foros del Web » Programación para mayores de 30 ;) » Java »

problema al querer crear trigger desde prepared statement

Estas en el tema de problema al querer crear trigger desde prepared statement en el foro de Java en Foros del Web. hola que tal , estoy creando una base de datos mysql desde java , hasta aqui no hay problema , el problema lo tengo cuando ...
  #1 (permalink)  
Antiguo 20/11/2012, 13:15
Avatar de fahs82  
Fecha de Ingreso: abril-2012
Ubicación: guadalajara
Mensajes: 139
Antigüedad: 12 años
Puntos: 12
problema al querer crear trigger desde prepared statement

hola que tal , estoy creando una base de datos mysql desde java , hasta aqui no hay problema , el problema lo tengo cuando quiero crear un trigger pues me lanza una excepcion , mi codigo es el siguiente
Código:
public void creartriggers(){
String TriggerBarcode = "DROP TRIGGER IF EXISTS ACTCODIGO";
String CrearTrigger = "CREATE TRIGGER actcodigo BEFORE INSERT ON BC_ARTICULOS FOR EACH ROW BEGIN DECLARE digito INT DEFAULT 0; DECLARE resultado INT DEFAULT 0; DECLARE IDN INT DEFAULT 0; DECLARE NUMPREV VARCHAR(30) DEFAULT 0; IF NEW.BARCODE IS NULL THEN SET IDN = (SELECT MAX(ID) FROM BC_ARTICULOS); IF IDN IS NULL THEN SET IDN = 1; ELSE SET IDN = (SELECT MAX(ID) FROM BC_ARTICULOS) +1; END IF; SET NUMPREV = 750000000000 + IDN; SET DIGITO = 10-(((substr(NUMPREV,2,1)+substr(NUMPREV,4,1)+substr(NUMPREV,6,1)+substr(NUMPREV,8,1)+substr(NUMPREV,10,1)+substr(NUMPREV,12,1))*3)+((substr(NUMPREV,1,1)+substr(NUMPREV,3,1)+substr(NUMPREV,5,1)+substr(NUMPREV,7,1)+substr(NUMPREV,9,1)+substr(NUMPREV,11,1))))mod 10; IF DIGITO < 10 THEN SET NEW.BARCODE = CONCAT(NUMPREV,DIGITO); ELSE  SET NEW.BARCODE = CONCAT(NUMPREV,'0'); ELSE SET NEW.BARCODE = CONCAT(NUMPREV,'0'); END IF; END";    
ConexionMySQL ConexionMysql = new ConexionMySQL();
Connection cn = ConexionMysql.Conectar();
try{
PreparedStatement stTrigger = cn.prepareStatement(TriggerBarcode);
stTrigger.execute();
PreparedStatement stCrearTrigger = cn.prepareStatement(CrearTrigger);
stCrearTrigger.execute();

}catch(Exception e){
JOptionPane.showMessageDialog(null, e);
}
}

y al correrlo me lanza la excepcion de com.mysql.jdbc.exceptions.jdbc4.MySQL SyntaxErrorException : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ELSE SET NEW.BARCODE = CONCAT(NUMPREV,'0'); END IF; END' at line 1


antes tenia definido delimiter ! asi pero lo elimine , al correrlo si me lo acepta en la consola de mysql pero aqui me tira ese error , agradeceria me pudieran orientar que es lo que esta fallando al pasar la syntaxis para crear el trigger , de antemano gracias por la atencion
  #2 (permalink)  
Antiguo 21/11/2012, 05:38
Avatar de hschimpf  
Fecha de Ingreso: junio-2009
Ubicación: in the World Wide Web
Mensajes: 140
Antigüedad: 14 años, 10 meses
Puntos: 17
Respuesta: problema al querer crear trigger desde prepared statement

Cita:
Iniciado por fahs82 Ver Mensaje
Código:
...
DELIMITER $$; 
CREATE TRIGGER actcodigo 
BEFORE INSERT ON BC_ARTICULOS 
FOR EACH ROW 
BEGIN 
    DECLARE digito INT DEFAULT 0; 
    DECLARE resultado INT DEFAULT 0; 
    DECLARE IDN INT DEFAULT 0; 
    DECLARE NUMPREV VARCHAR(30) DEFAULT 0; 
    IF NEW.BARCODE IS NULL THEN 
        SET IDN = (SELECT MAX(ID) FROM BC_ARTICULOS); 
        IF IDN IS NULL THEN 
            SET IDN = 1; 
        ELSE 
            SET IDN = (SELECT MAX(ID) FROM BC_ARTICULOS) +1; 
        END IF; 
        SET NUMPREV = 750000000000 + IDN; 
        SET DIGITO = 10-(((substr(NUMPREV,2,1)+substr(NUMPREV,4,1)+substr(NUMPREV,6,1)+substr(NUMPREV,8,1)+substr(NUMPREV,10,1)+substr(NUMPREV,12,1))*3)+((substr(NUMPREV,1,1)+substr(NUMPREV,3,1)+substr(NUMPREV,5,1)+substr(NUMPREV,7,1)+substr(NUMPREV,9,1)+substr(NUMPREV,11,1))))mod 10; 
        IF DIGITO < 10 THEN 
            SET NEW.BARCODE = CONCAT(NUMPREV,DIGITO); 
        ELSE 
            SET NEW.BARCODE = CONCAT(NUMPREV,'0'); 
           <<< Falta cerrar el IF
    ELSE 
        SET NEW.BARCODE = CONCAT(NUMPREV,'0'); 
    END IF; 
END
...
Posiblemente te falta cerrar el IF que te comente en el codigo.

Suerte!
__________________
Hermann D. Schimpf
Visita mis repositorios de:
Clases Java: http://code.google.com/p/javaclassesrepository/
Clases PHP: http://code.google.com/p/phpclassesrepository/
  #3 (permalink)  
Antiguo 21/11/2012, 11:09
Avatar de fahs82  
Fecha de Ingreso: abril-2012
Ubicación: guadalajara
Mensajes: 139
Antigüedad: 12 años
Puntos: 12
Respuesta: problema al querer crear trigger desde prepared statement

gracias ya pude resolver mi problema ,entre las veces que copiaba y adaptaba el trigger de mi script lo deforme y hubo algunos espacios que habia omitido , dejo el codigo correcto y las siguientes observaciones para quien se encuentre en el mismo problema que yo

1- se debe de proporcionar las multiqueries en la cadena de conexion del driver de jdbc la cual se especifica despues de la base de datos , en mi caso iploc es donde coloco la ip de mi servidor y db es donde coloco el nombre de la base de datos

Código:
public String url ="jdbc:mysql://" + iploc +"/" + db + "?allowMultiQueries=true";
2- se elimina el delimiter de el script de sentencia , por defecto el driver parsea el comando y crea el trigger

3-se deben de reconocer los espacios exactos entre cada linea y palabra pues la omision o espacio en blanco sobrante provocan un error en la sintaxis

en mi caso se debio a que escribi lineas de mas , omiti comas y al hacer copypaste en algunos casos no verifique que la secuencia fuera la adecuada , agradesco la ayuda del compañero y espero sea de ayuda los detalles que encontre para los que al igual que yo se encontraban despistados sobre la creacion de triggers a travez del jdbc en mysql , al calce posteo el codigo correcto ya probado

Código:
 String TriggerBarcode = "CREATE TRIGGER ACTCODIGO "
+ "BEFORE INSERT ON BC_ARTICULOS "
+ "FOR EACH ROW BEGIN "
+ "DECLARE digito INT DEFAULT 0; "
+ "DECLARE resultado INT DEFAULT 0; "
+ "DECLARE IDN INT DEFAULT 0; "
+ "DECLARE NUMPREV VARCHAR(30) DEFAULT 0; "
+ "IF NEW.BARCODE IS NULL THEN "
+ "SET IDN = (SELECT MAX(ID) FROM BC_ARTICULOS); "
+ "IF IDN IS NULL THEN "
+ "SET IDN = 1; "
+ "ELSE "
+ "SET IDN = (SELECT MAX(ID) FROM BC_ARTICULOS)+1; "            
+ "END IF; "
+ "SET NUMPREV = 750000000000 + IDN; "
+ "SET DIGITO = 10-(((substr(NUMPREV,2,1)+substr(NUMPREV,4,1)+substr(NUMPREV,6,1)+substr(NUMPREV,8,1)+substr(NUMPREV,10,1)+substr(NUMPREV,12,1))*3)+((substr(NUMPREV,1,1)+substr(NUMPREV,3,1)+substr(NUMPREV,5,1)+substr(NUMPREV,7,1)+substr(NUMPREV,9,1)+substr(NUMPREV,11,1))))mod 10; "
+ "IF DIGITO < 10 THEN SET NEW.BARCODE = CONCAT(NUMPREV,DIGITO); "
+ "ELSE  SET NEW.BARCODE = CONCAT(NUMPREV,'0'); "
+ "END IF; "
+ "END IF; "
+ "END";

Etiquetas: java-mysql, mysql, trigger
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:54.