2010-08-14 8 views
8

Tengo un código que desencadena un error de sintaxis debido a algunos puntos y comas incorrectos. si esto se ejecutara en la línea de comando, resolvería esto con un delimitador. desafortunadamente, el controlador jdbc4 no parece reconocer los delimitadores. de todos modos para que esto se ejecute?El controlador mysql jdbc no admite delimitadores en desencadenantes con varias sentencias

delimiter | 
CREATE TRIGGER obs_update BEFORE UPDATE ON obs 
FOR EACH ROW 
BEGIN 
    IF OLD.voided = 0 AND NEW.voided = 1 THEN 
     DELETE FROM clinic_obs WHERE id = OLD.obs_id; 
    ELSE 
     UPDATE clinic_obs SET clinic_obs.revision_token = NOW() 
     WHERE NEW.obs_id = clinic_obs.id; 
    END IF; 
END; 
| 
delimiter ; 

Respuesta

4

Delimiter es un comando para el cliente SQL. No es necesario usar delimitador en JDBC. siguiente ejemplo muestra que:

import java.sql.*; 

public class TriggerExample { 

    public static void main(String args[]) { 

     String connectionURL = "jdbc:mysql://localhost:3306/test"; 
     Connection con = null; 

     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      con = DriverManager.getConnection(connectionURL, "login", 
        "password"); 
      Statement stmt = con.createStatement(); 
      stmt.execute("CREATE TRIGGER obs_update BEFORE UPDATE ON obs " 
        + "FOR EACH ROW " 
        + "BEGIN " 
        + "IF OLD.voided = 0 AND NEW.voided = 1 THEN " 
        + " DELETE FROM clinic_obs WHERE id = OLD.obs_id; " 
        + "ELSE " 
        + " UPDATE clinic_obs SET clinic_obs.revision_token = NOW() " 
        + " WHERE NEW.id = clinic_obs.id; " 
        + "END IF; " 
        + "END;"); 
      con.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (con != null) { 
       try { 
        con.close(); 
       } catch (SQLException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
0

intente eliminar el punto y coma después de la palabra FIN final. por lo que se ve así:

delimiter | 
CREATE TRIGGER obs_update BEFORE UPDATE ON obs 
FOR EACH ROW 
BEGIN 
    IF OLD.voided = 0 AND NEW.voided = 1 THEN 
     DELETE FROM clinic_obs WHERE id = OLD.obs_id; 
    ELSE 
     UPDATE clinic_obs SET clinic_obs.revision_token = NOW() 
     WHERE NEW.obs_id = clinic_obs.id; 
    END IF; 
END| 

Debería funcionar porque he hecho un disparador/procedimiento similar usando el controlador jdbc.

Cuestiones relacionadas