Ver Mensaje Individual
  #6 (permalink)  
Antiguo 24/09/2009, 06:19
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Un error en CREATE PROCEDURE que no encuentro la solución :

El SQLSTATE es un error que se genera al afectar una clave, o la unicidad de una columna.
En tu caso, se generaría al eliminar un registro que posea dependencias, es decir, done la clave del registro sea clave foranea (FK) en alguna parte.

El error está mucho más abajo:
Código sql:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS x.nombre $$
  3. CREATE PROCEDURE x.nombre (IN F CHAR,IN V CHAR, IN col1 CHAR(8),IN col2 CHAR(1))
  4. BEGIN
  5.    DECLARE flag INT DEFAULT 0;
  6.    DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @flag = 1;
  7.    DELETE FROM tabla1
  8.    WHERE id = F AND column1 = col1 AND column2 = col2;
  9.    SET @flag= 2;
  10.    IF @flag = 1 THEN
  11.       NULL; -- <--- En esta línea está el error.
  12.    END IF;
  13. END$$
  14. DELIMITER;

Hay tres problemas:
1. NULL; no puede ser una sentencia, porque simplemente porque NULL es un valor (nulo en este caso). Tendría sentido si pusieras
Código sql:
Ver original
  1. SET flag = NULL;
pero no así.
2. No debes usar los mismos nombres para las variables que para los campos. MySQL asumirá que el objeto es un campo y descartará la variable, con lo que en esa sentencia estabas diciendo que borrara todo...
3. flag es una variable local del SP, @flag no, @flag es una variable global de sesion del usuario y su valor se mantendrá en memoria en tanto la conexión no se cierre y se vuelva abrir. De hecho, @flag no necesitas declararla, porque comienza a existir cuando la invocas. Lo que debes hacer es cargarle un valor para que adopte un tipo:
Código sql:
Ver original
  1. @flag := 0;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)