存储过程SQL语法:错误缺失> '结束'

时间:2016-08-19 06:57:54

标签: mysql stored-procedures

基本上我没有找到我必须结束的地方。所以希望你能帮助我知道它必须找到什么来修复错误。 谢谢 .................................................. ..................

CREATE PROCEDURE `ANULAR_FACTURA` (IN ID_FACTURA VARCHAR(25))

BEGIN
'Declaro las variables que voy a necesitar'
DECLARE COD_PRODUCTO INT DEFAULT 0;
DECLARE COD_DET_VENT INT DEFAULT 0;
DECLARE CANT_VENTA INT DEFAULT 0;
DECLARE CANT_ACTUAL INT DEFAULT 0;
DECLARE CANT_FINAL INT DEFAULT 0;
'Declaro el cursor y asigno valores del select'
DECLARE FACTURA_CURSOR CURSOR FOR
SELECT PR.ID, DV.CANTIDAD, DV.ID
FROM FACTURAS FA JOIN DETALLE_VENTAS DV ON(FA.ID=DV.FACTURA) 
JOIN PRODUCTOS PR ON(DV.PRODUCTO=PR.ID)
WHERE FA.ID = ID_FACTURA;
'El HANDLER detecta el momento de parar cuando se recorrer el cursor'
DECLARE CONTINUE HANDLER FOR NOT FOUND SET @hecho = TRUE;
'Aperturo el cursor'
OPEN FACTURA_CURSOR;
'Comienzo el loop'
recorrido: LOOP

FETCH FACTURA_CURSOR INTO COD_PRODUCTO, CANT_VENTA, COD_DET_VENT;
'valido que no sea el ultimo registro'
IF @hecho THEN
LEAVE recorrido;
END IF;
'Busco la cantidad actual del producto en la tabla Producto'
SELECT INVENTARIO INTO CANT_ACTUAL 
FROM PRODUCTO WHERE ID = COD_PRODUCTO;
'Sumo la cantidad que se habia vendido mas lo actual'
SET CANT_FINAL := CANT_ACTUAL + CANT_VENTA;
'Actualizo la tabla Producto, haciendo ya efectia la devolucion'
UPDATE PRODUCTO SET INVENTARIO = CANT_FINAL WHERE ID = COD_PRODUCTO;
'Elimino el detalle de la factura'
DELETE FROM DETALLE_VENTAS WHERE ID = COD_DET_VENT;

END LOOP recorrido;
'Cierro el cursor'
CLOSE FACTURA_CURSOR;
'Elimino la factura completa'
DELETE FROM FACTURAS WHERE ID = ID_FACTURA;

END

1 个答案:

答案 0 :(得分:0)

我刚刚将评论语法从单引号更改为--,并且有效:

delimiter $$
CREATE PROCEDURE `ANULAR_FACTURA` (IN ID_FACTURA VARCHAR(25))
BEGIN
    -- Declaro las variables que voy a necesitar'
    DECLARE COD_PRODUCTO INT DEFAULT 0;
    DECLARE COD_DET_VENT INT DEFAULT 0;
    DECLARE CANT_VENTA INT DEFAULT 0;
    DECLARE CANT_ACTUAL INT DEFAULT 0;
    DECLARE CANT_FINAL INT DEFAULT 0;
    -- Declaro el cursor y asigno valores del select'
    DECLARE FACTURA_CURSOR CURSOR FOR
    SELECT PR.ID, DV.CANTIDAD, DV.ID
    FROM FACTURAS FA JOIN DETALLE_VENTAS DV ON(FA.ID=DV.FACTURA) 
    JOIN PRODUCTOS PR ON(DV.PRODUCTO=PR.ID)
    WHERE FA.ID = ID_FACTURA;
    -- El HANDLER detecta el momento de parar cuando se recorrer el cursor'
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET @hecho = TRUE;
    -- Aperturo el cursor'
    OPEN FACTURA_CURSOR;
    -- Comienzo el loop'
    recorrido: LOOP

    FETCH FACTURA_CURSOR INTO COD_PRODUCTO, CANT_VENTA, COD_DET_VENT;
    -- valido que no sea el ultimo registro'
    IF @hecho THEN
    LEAVE recorrido;
    END IF;
    -- Busco la cantidad actual del producto en la tabla Producto'
    SELECT INVENTARIO INTO CANT_ACTUAL 
    FROM PRODUCTO WHERE ID = COD_PRODUCTO;
    -- Sumo la cantidad que se habia vendido mas lo actual'
    SET CANT_FINAL := CANT_ACTUAL + CANT_VENTA;
    -- Actualizo la tabla Producto, haciendo ya efectia la devolucion'
    UPDATE PRODUCTO SET INVENTARIO = CANT_FINAL WHERE ID = COD_PRODUCTO;
    -- Elimino el detalle de la factura'
    DELETE FROM DETALLE_VENTAS WHERE ID = COD_DET_VENT;

    END LOOP recorrido;
    -- Cierro el cursor'
    CLOSE FACTURA_CURSOR;
    -- Elimino la factura completa'
    DELETE FROM FACTURAS WHERE ID = ID_FACTURA;

END$$
delimiter ;