如果没有,为什么mysql会说“语法错误”?

时间:2019-09-12 21:08:21

标签: mysql sql

我有一个查询,但是当我执行它时,mysql说我:

  

SQL错误(1064):您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册以获取正确的语法,以在第1行的“ END WHILE”附近使用

以下是查询:

BEGIN 
    DECLARE _ProductoId;
    DECLARE _ProductoCosto INT;
    DECLARE _Cantidad INT; 
    DECLARE _id INT DEFAULT 129;


    WHILE _id < 143 DO

        SET _ProductoId = SELECT Compra_ProductoId from tblcompradetalle WHERE CompraDetalleId = _id;
        SET _ProductoCosto = SELECT ProductoCosto from tblproducto WHERE ProductoId = _ProductoId;
        SET _Cantidad = SELECT CompraDetalleCantidad FROM tblcompradetalle WHERE CompraDetalleId = _id;

        UPDATE tblcompradetalle 
        SET compraDetalleSubtotal = (_ProductoCosto * _Cantidad), 
        SET ProductoPrecio= _ProductoCosto WHERE CompraDetalleId=_id;

        SET _id = _id + 1;

    END WHILE; 
END 

问题是我逐行查看了查询,但是找不到任何语法错误。哪个语法错误?

4 个答案:

答案 0 :(得分:0)

您有两个SET关键字。语法为UPDATE tbl SET a=1, b=2 WHERE...

在行末使用SET命令设置更新格式,然后您很容易记住不要包含两个SET关键字。

UPDATE tblcompradetalle SET
        compraDetalleSubtotal= (_ProductoCosto * _Cantidad),
        ProductoPrecio= _ProductoCosto
WHERE CompraDetalleId=_id;

答案 1 :(得分:0)

我认为您用双SET拼写了更新查询。 Mariadb文档提供了此查询的示例。

UPDATE [LOW_PRIORITY] [IGNORE] table_reference 
  [PARTITION (partition_list)]
  SET col1={expr1|DEFAULT} [,col2={expr2|DEFAULT}] ...
  [WHERE where_condition]
  [ORDER BY ...]
  [LIMIT row_count]

答案 2 :(得分:0)

请尝试使用此存储过程

CREATE DEFINER=`root`@`localhost` PROCEDURE `my_procedure`()
BEGIN 

    DECLARE _ProductoId int;
    DECLARE _ProductoCosto INT;
    DECLARE _Cantidad INT; 
    DECLARE _id INT DEFAULT 129;

   set _id = 129;
    WHILE _id < 143 DO

        SET _ProductoId = (SELECT Compra_ProductoId from tblcompradetalle WHERE CompraDetalleId = _id);
        SET _ProductoCosto = (SELECT ProductoCosto from tblproducto WHERE ProductoId = _ProductoId);
        SET _Cantidad = (SELECT CompraDetalleCantidad FROM tblcompradetalle WHERE CompraDetalleId = _id);

        UPDATE tblcompradetalle 
        SET compraDetalleSubtotal = (_ProductoCosto * _Cantidad), 
         ProductoPrecio= _ProductoCosto WHERE CompraDetalleId=_id;

        SET _id = _id + 1;

    END WHILE; 
END

如果您通过创建表给我一些示例数据,我可以对其进行进一步的测试

答案 3 :(得分:0)

也许还有其他方法,但以下方法可以作为存储过程起作用:

CREATE DEFINER=`root`@`localhost` PROCEDURE `spCompraDetalle`()
 LANGUAGE SQL
 NOT DETERMINISTIC
  CONTAINS SQL
  SQL SECURITY DEFINER
 COMMENT ''
 BEGIN


   DECLARE _ProductoId int;
  DECLARE _ProductoCosto INT;
 DECLARE _Cantidad INT; 
 DECLARE _id INT DEFAULT 129;


WHILE _id < 143 DO

    SET _ProductoId = (SELECT Compra_ProductoId from tblcompradetalle WHERE CompraDetalleId = _id);
    SET _ProductoCosto = (SELECT ProductoCosto from tblproducto WHERE ProductoId = _ProductoId);
    SET _Cantidad = (SELECT CompraDetalleCantidad FROM tblcompradetalle WHERE CompraDetalleId = _id);

    UPDATE tblcompradetalle 
    SET compraDetalleSubtotal = (_ProductoCosto * _Cantidad), 
     CompraDetallePrecio= _ProductoCosto WHERE CompraDetalleId=_id;

    SET _id = _id + 1;

   END WHILE; 

 END

...

 CALL `spCompraDetalle`()