我正在尝试建立一个流程,我的团队可以使用变量和基本脚本进行常规数据库更改。我只是在许多操作中的第一个,甚至无法执行它。我们的想法是在脚本顶部分配变量,并说明是否要以test
或prod
模式运行脚本。
test
应该只是模拟更改,向您展示会发生什么并将事务回滚,而prod
将实际提交事务并显示更新的行。
当我单独运行这些行时,它们可以工作,但总是会说语法错误。我很乐意帮助调试这个,但如果有人有更好的解决方案来解决这个问题,我很乐意听到它。
好的,这是启动代码,提前谢谢!
#ADD A NEW QUESTION CATEGORY
SET @new_category_name = 'NEW CATEGORY NAME HERE';
SET @prod_or_test = 'PROD';
START TRANSACTION;
#SET IT'S SORT_ORDER TO BE AT THE END OF THE LIST
SET @last_sort_order = ((SELECT MAX(`sort_order`) FROM question_categories)+1);
#INSERT THE NEW ROW
INSERT INTO question_categories (name, sort_order) VALUES (@new_category_name, @last_sort_order);
IF (@prod_or_test = 'PROD') THEN
COMMIT;
SELECT * FROM question_categories WHERE name = @new_category_name;
ELSE
ROLLBACK;
END IF;
更新以包含错误消息:
[ERROR in query 6] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF (@prod_or_test = 'PROD') THEN
COMMIT' at line 1
[ERROR in query 8] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ELSE
ROLLBACK' at line 1
[ERROR in query 9] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END IF' at line 1
答案 0 :(得分:1)
IF
,THEN
,ELSE
和END IF
不是MySQL 存储程序上下文之外的有效SQL语句。例如,PROCEDURE或TRIGGER定义。
参考:https://dev.mysql.com/doc/refman/5.7/en/if.html
IF
语句可以在存储的程序中使用,但不能用作独立的SQL语句。
此外,IF
语句不应与IF()
函数混淆,SELECT
函数可用于UPDATE
或 SELECT t.foo, IF(t.foo='bar',41,NULL) AS bar, ...
等语句的上下文中,这是有效的SQL语句。
IF
某些语句包含 DROP TABLE IF EXISTS foo;
关键字作为其语法的一部分,例如:
IF
请注意,在此示例中,DROP
关键字是IF
语句的一部分;这不是一个单独的声明。
<强>后续强>
“最终目标是拥有一个脚本......但是......看起来我实际上正在尝试通过此脚本调用一些存储过程。”
原始答案(上面)解决了MySQL存储程序之外的IF
语句的使用问题。如果您需要使用IF
语句,那么可以在PROCEDURE中完成。
但是,并非严格要求PREPARE
语句。您可以使用EXECUTE
,DEALLOCATE PREPARE
和IF()
语句完成几乎相同的操作来执行动态创建的SQL。
参考:https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
例如,我们可以对SELECT
语句中的COMMIT
函数中的用户定义变量执行条件测试,并有条件地返回要执行的SQL文本。在这种情况下,可以是ROLLBACK
或 -- add a new question category
SET @new_category_name := 'NEW CATEGORY NAME HERE';
SET @prod_or_test := 'PROD';
START TRANSACTION;
-- set it's sort_order to be at the end of the list
SELECT IFNULL(MAX(`sort_order`)+1,1)
FROM question_categories
INTO @last_sort_order
;
-- insert the new row
INSERT INTO question_categories (name, sort_order)
VALUES (@new_category_name, @last_sort_order)
;
-- conditionally execute a COMMIT or ROLLBACK
SELECT IF(@prod_or_test='PROD','COMMIT','ROLLBACK') INTO @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT *
FROM question_categories
WHERE @prod_or_test = 'PROD'
AND name = @new_category_name ;
语句。
我认为这样的事情会起作用:
{{1}}
答案 1 :(得分:0)
问题是括号
IF (@prod_or_test = 'PROD') THEN
到
IF @prod_or_test = 'PROD' THEN
语法
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF