我正在运行Workbench 5.2.47。
我用基本数据检查编写了一个很长的程序。如果数据库中不存在记录,则会插入记录。
程序保存没有问题,但MySQL 5.5在我尝试运行时抛出错误。
它很长,并且有很多公司敏感数据,或者我会在这里发布。
我试图通过执行一小段代码来调试程序,但我似乎无法让Workbench允许我尝试的任何内容。
MySQL展示了如何在5.1.5 Working with Stored Procedures中创建存储过程。
让我告诉你一些我想写的基本内容:
DELIMITER $$
DROP PROCEDURE IF EXISTS my_test;
CREATE PROCEDURE my_test()
BEGIN
SELECT * FROM Employees;
END $$
DELIMITER ;
有了这个,Workbench给了我错误,“语法错误,意外的CREATE,期待$ end”。
我不明白,但我需要完成一些事情,所以我继续前进。
我做了一个更简单的查询:
SET @Count=(SELECT Count(*) FROM tbl_object_users WHERE username='jp2code');
IF (@Count < 1) THEN
INSERT INTO tbl_object_users (username, date_time) VALUES ('jp2code', NOW());
END IF;
同样,我收到错误,这次是在我的IF声明中。
接下来,我进入PhpMyAdmin尝试使用其数据库运行一些东西:
SET @Count=Count(id) FROM `tbl_object_users` WHERE `username`='jp2code';
它也告诉我我的SQL语法有错误。
我确实下载并安装了最新的Workbench 6,但它没有解决问题 - 而且我不喜欢这个界面,因此我将其卸载并返回Workbench 5.2。
答案 0 :(得分:7)
问题:
DELIMITER $$
DROP PROCEDURE IF EXISTS my_test;
CREATE PROCEDURE my_test() ...
是MySQL在DROP PROCEDURE
语句行的末尾没有看到分号作为语句的结尾。这是因为上一行告诉MySQL语句终止符不是分号。你告诉MySQL,声明将以两个美元符号终止。所以MySQL正在读取DROP PROCEDURE
行,寻找语句终止符。并且它读取的整个blob不是有效的MySQL语句,它会生成语法错误。
修复:移动DROP PROCEDURE
行之前 DELIMITER $$
行;或使用指定的分隔符而不是分号终止DROP PROCEDURE
语句。
您报告的第二个问题是语法错误。这是因为MySQL无法将 IF
识别为有效SQL语句的开头。
IF
语句在MySQL存储程序的上下文中仅在 中有效(例如,在CREATE PROCEDURE
语句中。)
修复:仅在MySQL存储程序的上下文中使用IF
语句。
您报告的第三个问题也是语法错误。这是因为您没有SET
语句的有效语法;用于为用户变量赋值的SET
语句的MySQL语法是:
SET @uservar = expr
MySQL在等号后面期待表达式。 MySQL 不期待SQL语句。
要将值作为SELECT
语句的结果赋给用户变量,请在SELECT语句中执行赋值,例如:
SELECT @Count := Count(id) FROM `tbl_object_users` WHERE `username`='jp2code'
请注意,SELECT
语句中的赋值运算符为 :=
(冒号等于),而不仅仅是 =
。< / p>
答案 1 :(得分:4)
试试这个
DELIMITER $$
DROP PROCEDURE IF EXISTS my_test$$
CREATE PROCEDURE my_test()
BEGIN
SELECT * FROM `customer_to_pay`;
END $$
DELIMITER ;