我正在尝试制作一个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'(单引号文本)不是此位置的有效输入
答案 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');