运行存储过程时出错 ERROR 1064 (42000)

Posted

技术标签:

【中文标题】运行存储过程时出错 ERROR 1064 (42000)【英文标题】:getting an error while running a stored procedure ERROR 1064 (42000) 【发布时间】:2020-11-03 20:56:17 【问题描述】:
CREATE PRODECURE prc_inv_amounts
@inv_num DECIMAL
BEGIN
UPDATE INVOICE SET
INV_SUBTOTAL = (SELECT SUM(LINE_TOTAL) FROM LINE WHERE INV_NUMBER = @inv_num),
INV_TAX = INV_SUBTOTAL * 0.8,
INV_TOTAL = INV_SUBTOTAL + INV_TAX
WHERE INV_NUMBER = @inv_num
END

错误:

ERROR 1064 (42000) at line 1:您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 1 行的“PRODECURE prc_inv_amounts @inv_num DECIMAL BEGIN UPDATE INVOICE SET INV_SUBTOTAL”附近使用正确的语法

【问题讨论】:

您是否检查过它在使用CREATE PROCEDURE 时是否有效(注意拼写的差异!)? 80% 的税似乎过高。 【参考方案1】:

看起来你已经获取了一些 sqlserver 代码并将其转储到 mysql 中。不幸的是,sqlserver 和 mysql 在 SP 语法和变量声明上有很大的不同。

翻译成mysql的代码是

DELIMITER $$
CREATE PROcedURE prc_inv_amounts(inv_num int)
BEGIN
declare vinv_subtotal decimal(10,2);
SELECT SUM(LINE_TOTAL) into vinv_subtotal FROM LINE WHERE INV_NUMBER = inv_num;
UPDATE INVOICE SET
INV_SUBTOTAL = vinv_subtotal,
INV_TAX = vINV_SUBTOTAL * 0.8,
INV_TOTAL = vINV_SUBTOTAL + (vINV_SUBTOTAL * 0.8)
WHERE INV_NUMBER = inv_num;
END $$
delimiter ;

注意使用分隔符https://dev.mysql.com/doc/refman/8.0/en/stored-programs-defining.html,输入参数必须定义在括号中作为create语句的一部分https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html,用户定义的声明变量不一样How to declare a variable in MySQL?,每个语句必须以; (分号)

我还移动了小计计算。

【讨论】:

你确定这行得通吗? PRODECURE 在我看来仍然不对

以上是关于运行存储过程时出错 ERROR 1064 (42000)的主要内容,如果未能解决你的问题,请参考以下文章

mysql error code '1064' 排查过程

mysql error (#1064) 存储过程创建错误

在MySQL中尝试Forward Engineering时出错1064

在 MySQL/MariaDB 中创建存储过程时出错

错误:将 sql 脚本应用到数据库时出错,错误:1064 检查 Mariadb 服务器手册以获取正确的语法

如何使用 phpmyadmin 在存储过程中创建一段时间,错误 #1064