编辑:请注意:我要求的东西是不可能的,如底部所述!因此,问题得到了回答。
亲爱的人堆满了,
我在存储过程中的准备好的语句中遇到语法错误问题。运行过程时出现语法错误,但如果手动执行“SELECT @sql;”返回的语法则不会 命令。它与分隔符有关,因为如果我只有一个命令,它在过程中运行良好。我没有在我的过程中使用任何表格以便于复制:
DROP PROCEDURE IF EXISTS stackoverflow_test;
DELIMITER $$
CREATE PROCEDURE stackoverflow_test ()
BEGIN
SET @sql = CONCAT('
SELECT "test12" AS test1;
SELECT "test34" AS test2;
');
#return the statement from @sql
SELECT @sql;
#execute the statement from @sql
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
CALL stackoverflow_test ();
我试图寻找这个,但所有命中都是关于定义过程时 DELIMITER 命令的一般用途。现在我知道分隔符在客户端工作。我是否必须在保存在服务器上的语句中使用其他内容?编辑:我确实尝试使用 $$ 作为分隔符,这产生了相同的语法错误。
最好的排骨
编辑:这似乎是不可能的。“准备好的语句的 SQL 语法不支持多语句”来源:http ://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html 。对我来说,解决方案是将准备好的语句减少为一个语句,并在执行过程中移动其他语句,这对我有用,因为其他语句是静态的:
#first static statement
DROP TABLE IF EXISTS `table`;
#dynamic statement
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
#second static statement
ALTER TABLE `table`
ADD UNIQUE INDEX sdef ( `cntry`, `track`, `year` );