如果没有语法错误,为什么mysql会说“语法错误”?
我有一个查询,但当我执行它时,请告诉我: SQL 1064错误:您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,了解第1行“END WHILE”附近使用的正确语法 问题是:如果没有语法错误,为什么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
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`()