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

如果没有语法错误,为什么mysql会说“语法错误”?,mysql,sql,Mysql,Sql,我有一个查询,但当我执行它时,请告诉我: 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

我有一个查询,但当我执行它时,请告诉我:

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 

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

您设置了两个关键字。语法是更新tbl集合a=1,b=2,其中

使用行末尾的SET命令格式化更新,您将很容易记住不要包含两个SET关键字

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

我想你把update查询拼错了。Mariadb docs给出了此查询的一个示例

更新[低优先级][忽略]表参考 [分区列表] 设置col1={expr1 | DEFAULT}[,col2={expr2 | DEFAULT}]。。。 [何处条件] [由……订购] [限制行数]
请尝试此存储过程

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

如果您给我一些create table的示例数据,我可以进一步测试它

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

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

从更新中删除两个SET关键字中的一个。只需要一个。Ex:udpate t set col1=1,col2=2;此外,我认为在声明局部变量时需要数据类型,例如DECLARE _productoidint;我不完全确定这是必要的。如果它不是必需的,并且被省略,那么MariaDB为局部变量分配了什么数据类型?为了将来读者的利益,我们应该继续指定它,即使它不是必需的。但错误仍然存在。控制台显示预览错误。在每个变量之后,表示该变量对于ex:Error de SQL 1193:Unknown system variable'\u ProductoId'是未知的,我删除额外的集合并将数据类型放入所有变量。但同样的错误仍然存在。同时查看控制台,它会显示预览错误。使用后,每个变量都会出现以下情况:/*错误de SQL 1193:未知系统变量'\u id'/END WHILE;/SQL 1064错误:您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以了解在第1行的“END WHILE”附近使用的正确语法*/这是一个突出的动作,但尝试从declare复制_id,并粘贴到每个变量控制台表示该变量未知的位置,例如:Error de SQL 1193:未知系统变量“_ProductoId”。这对我来说很少见,因为变量是声明的。我删除了额外的集合并将数据类型放入所有变量。但错误仍然存在。控制台显示预览错误。在每个变量之后,说明该变量对于ex:Error de SQL 1193:Unknown system variable'\u ProductoId'调用my_procedure Error de SQL 1054:field list'中的未知列'productPrecio',然后检查表tblcompradetalle中是否存在此类列Poductoprecio
 CALL `spCompraDetalle`()