Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Un error en CREATE PROCEDURE que no encuentro la solución :

Estas en el tema de Un error en CREATE PROCEDURE que no encuentro la solución : en el foro de Mysql en Foros del Web. CREATE PROCEDURE x.nombre (IN F CHAR,IN V CHAR, IN column1 CHAR(8),IN column2 CHAR(1)) BEGIN ....... DELETE FROM tabla1 AS A WHERE A.id = id AND ...
  #1 (permalink)  
Antiguo 24/09/2009, 03:06
 
Fecha de Ingreso: junio-2009
Mensajes: 174
Antigüedad: 14 años, 10 meses
Puntos: 0
Un error en CREATE PROCEDURE que no encuentro la solución :

CREATE PROCEDURE x.nombre (IN F CHAR,IN V CHAR, IN column1 CHAR(8),IN column2 CHAR(1))
BEGIN
.......
DELETE FROM tabla1 AS A WHERE A.id = id AND A.column1 = column1 AND
A.column2 = column2;
.......



Script line: 3 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 'AS A WHERE A.id = id AND A.column1 = column1 AND A.column2 = column2;
' at line 14

Gracias por tu atención.
  #2 (permalink)  
Antiguo 24/09/2009, 04:53
Avatar de Valery-Net  
Fecha de Ingreso: agosto-2008
Mensajes: 694
Antigüedad: 15 años, 7 meses
Puntos: 12
Respuesta: Un error en CREATE PROCEDURE que no encuentro la solución :

Y porque no intentas quitando el A

Cita:
DELETE FROM tabla1 WHERE tabla1.id = id AND tabla1.column1 = column1 AND
tabla1.column2 = column2;
  #3 (permalink)  
Antiguo 24/09/2009, 05:07
 
Fecha de Ingreso: junio-2009
Mensajes: 174
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Un error en CREATE PROCEDURE que no encuentro la solución :

Muy bien.
Porque mi código casca ?, sino tengo ninguna otra tabla sobrenombrada como A dentro de este create !
Gracias.
  #4 (permalink)  
Antiguo 24/09/2009, 05:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Un error en CREATE PROCEDURE que no encuentro la solución :

Postea el código completo. Que el error sea marcado en ese punto no quiere decir que no esté en otra parte.
Lo que te muestra es el último segmento que pudo interpretar, por eso dice "near..." o sea "cerca de... ".
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 24/09/2009, 05:34
 
Fecha de Ingreso: junio-2009
Mensajes: 174
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Un error en CREATE PROCEDURE que no encuentro la solución :

Cita:
DELIMITER $$
DROP PROCEDURE IF EXISTS x.nombre $$
CREATE PROCEDURE x.nombre (IN F CHAR,IN V CHAR, IN column1 CHAR(8),IN column2 CHAR(1))
BEGIN


-- Declaro el handler que al darse una condicion
-- continue su ejecucion, pero registre un flag
DECLARE flag INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @flag = 1;

DELETE FROM tabla1 AS A WHERE A.id = id AND A.column1 = column1 AND
A.column2 = column2;
SET @flag= 2;


-- Si flag=1 es porque se dio la condicion SQLSTATE '23000'
-- (23000, en realidad, engloba muchos errores de violacion)
IF @flag = 1 THEN
NULL;
END IF;
END$$
DELIMITER;
Este es mi código que estoy desarrollando, pero como os he dicho esa A me está dando error no se porque y por lo tanto he cambiado por el nombre entero de la tabla haciendo caso a la anterior compañera. Por otra parte dentro del if el Null me está dando error no se el motivo.
Gracias por todo.
  #6 (permalink)  
Antiguo 24/09/2009, 06:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
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)
  #7 (permalink)  
Antiguo 24/09/2009, 07:27
 
Fecha de Ingreso: junio-2009
Mensajes: 174
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Un error en CREATE PROCEDURE que no encuentro la solución :

Hola gnzsoloyo,
Me dijiste que tenía que sacar los procedures y funciones fuera del trigger, por lo tanto eso conlleva que tengo que añadir a esos procedures y funciones nuevos parámetros. Con un ejemplo espero que me entiendas mejor:
--------------------------------------------------------
CREATE TRIGGER dar_la_mano
BEFORE INSERT
ON saludos FOR EACH ROW
BEGIN
.....
hola (saludos.nombre);
.....
END;


--------------------------------------------------------

CREATE PROCEDURE hola ( ??) RETURNS CHAR(20)

?? => Piensa que queremos insertar una nueva persona a la tabla saludos y dentro de esa tabla tenemos el nombre de la persona. Como es nuevo la persona y antes de insertar se salta el evento "dar_la_mano", como puedo obtener dentro del procedure "hola" su nombre? Yo intuyo que le tendremos que pasar mediante parámetro, no ?

Estoy planteandolo bien mi problema ?
Gracias.
  #8 (permalink)  
Antiguo 24/09/2009, 07:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Un error en CREATE PROCEDURE que no encuentro la solución :

Existen dos formas:
1. Con un procedimiento almacenado, se pasa un parámetro como OUT o INOUT:
Código SQL:
Ver original
  1. CREATE PROCEDURE hola (OUT nombre CHAR(100))
  2. BEGIN
  3. -- ....
  4. END;
2. Con una función, los parámetros de entrada son siempre IN y la salida es única y es parte del prototipo:
Código SQL:
Ver original
  1. CREATE FUNCTION hola (OUT nombre CHAR(100)) RETURNS CHAR(100)
  2. READS SQL DATA
  3. BEGIN
  4. -- ....
  5. END;
El READS SQL DATA es para evitar problemas de modo de servidor, ya que debe determinarse qué es lo que hará.

Ahora bien, Dentro de cualquier script, un procedure se llama con CALL:

Código sql:
Ver original
  1. CREATE TRIGGER dar_la_mano
  2. BEFORE INSERT
  3. ON saludos FOR EACH ROW
  4. BEGIN
  5. .....
  6. CALL hola (NEW.nombre);
  7. .....
  8. END;

Mientras que un SF se invoca directamente, pero debe meter el resultado en alguna parte:
Código sql:
Ver original
  1. CREATE TRIGGER dar_la_mano
  2. BEFORE INSERT
  3. ON saludos FOR EACH ROW
  4. BEGIN
  5. .....
  6. @saludo:=hola (NEW.nombre);
  7. .....
  8. END;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 17:12.