在过程中的预准备语句中使用分隔符

时间:2013-05-03 12:49:13

标签: mysql

编辑:请注意:我要求的东西是不可能的,正如底部所解释的那样!因此,问题得到了回答。

亲爱的人堆满了堆,

我在存储过程中的预准备语句中遇到语法错误问题。我运行该过程时出现语法错误,但如果我手动执行“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命令的一般用法。现在我知道分隔符在客户端工作。我是否必须在服务器上保存的语句中使用其他内容?编辑:我确实尝试使用$$作为分隔符,产生相同的语法错误。

最佳

chonez

编辑:这似乎是不可能的。 “预处理语句的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` );

2 个答案:

答案 0 :(得分:2)

您在开始时将分隔符更改为$$

DELIMITER $$

你需要在你的sql中使用它:

SET @sql = CONCAT('
    SELECT "test12" AS test1$$
    SELECT "test34" AS test2$$
');

和另一件事:

SET @sql = CONCAT('
    SELECT "test12" AS test1;
    SELECT "test34" AS test2;
');

也不是,请尝试这种方式:

SET @sql = 'SELECT "test12" AS test1$$SELECT "test34" AS test2$$';

答案 1 :(得分:2)

正如主帖中所解释的那样,似乎是不可能的:“预处理语句的SQL语法不支持多语句”

来源:http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html