2016-08-19 71 views
0

基本上我沒有找到我必須結束的地方。所以希望你能幫助我知道它的位置,以解決錯誤。 謝謝 ............................................... .....................存儲過程SQL語法:錯誤缺失>'結束'

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

+0

缺少分隔符,所以將第一行添加爲'delimiter //',最後一行變爲'END; //' –

+0

謝謝。但錯誤仍然存​​在 – robto09

+0

代碼中的註釋需要以#爲前綴(用於mysql中的單行註釋) –

回答

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 ;