我的EXECUTE命令出了什么问题?

时间:2017-10-26 11:27:56

标签: sql procedure mysql-error-1064 execute heidisql

我正在尝试制作一个PROCEDURE,以便更轻松地将用户在其设置中所做的更改(例如服务器日志,您知道的权利)存储到表user_settings_changelog中。我终于让PROCEDURE可以接受,所以我的sql程序(HeidiSQL)会存储它。现在的问题是:如何正确EXECUTE它。我用多行代码多次尝试过,但似乎没什么用。任何人都可以帮助我吗?

PROCEDURE查询:

DELIMITER $$
CREATE PROCEDURE setting_adjustment_log (name_setting VARCHAR(45), 
changed_from VARCHAR(45), changed_to VARCHAR(45), username 
VARCHAR(45))
BEGIN
    INSERT INTO user_settings_changelog
    VALUES (GETDATE(), name_setting, changed_from, changed_to, 
username);
END$$

user_settings_changelog有5列:日期DATETIME,name_setting VARCHAR(45),changed_from VARCHAR(45),changed_to VARCHAR(45)和用户名VARCHAR(45)。< / p>

EXECUTE查询:

EXECUTE setting_adjustment_log ('background','black','white','TheCoderNoob');

HeidiSQL给我的错误:

SQL错误(1064):您的SQL语法中有错误;查看与您的MySQL服务器版本相对应的手册,以便在第1行的'('background','black','white','TheCoderNoob')附近使用正确的语法

也许有用的提醒:几年前我使用的是一个版本的USBwebserver。

编辑:我一直在查看MySQL Workbench中的EXECUTE / CALL查询一段时间,似乎数据库需要在程序名称和给定数据之间存在某种东西。当我将鼠标悬停在它上面时,它显示为:

语法错误:'background'(单引号文本)不是此位置的有效输入

1 个答案:

答案 0 :(得分:2)

首先,您应始终在insert语句中包含列名。 (可能有一些例外情况,但如果您正在学习SQL,那么请坚持使用最佳实践。)

其次,将输入参数与可能的列名区分开来。

第三,你的代码看起来像MySQL,所以使用NOW()或类似的函数:

DELIMITER $$
CREATE PROCEDURE setting_adjustment_log (
    in_name_setting VARCHAR(45), 
    in_changed_from VARCHAR(45),
    in_changed_to VARCHAR(45),
    in_username VARCHAR(45)
)
BEGIN
    INSERT INTO user_settings_changelog (date, name_setting, changed_from, changed_to, username)
    VALUES (NOW(), in_name_setting, in_changed_from, in_changed_to, 
in_username);
END$$

调用存储过程时,请使用call

CALL setting_adjustment_log('background', 'black', 'white', 'TheCoderNoob');