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 originalDELIMITER $$
DROP PROCEDURE IF EXISTS x.nombre $$
CREATE PROCEDURE x.nombre (IN F CHAR,IN V CHAR, IN col1 CHAR(8),IN col2 CHAR(1))
BEGIN
DECLARE flag INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @flag = 1;
DELETE FROM tabla1
WHERE id = F AND column1 = col1 AND column2 = col2;
SET @flag= 2;
IF @flag = 1 THEN
NULL; -- <--- En esta línea está el error.
END IF;
END$$
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
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: