在存储过程中准备好IF块

时间:2015-01-13 04:43:03

标签: mysql stored-procedures prepared-statement

我在存储过程中测试了MySQL的PREPARE stmt FROM preparable_stmt;功能,并决定尝试从IF开始尝试控制块:

DELIMITER $$
CREATE PROCEDURE `testif`(t TEXT) BEGIN
    DECLARE q TEXT;
    SET @q:=CONCAT("IF (SELECT COUNT(*) FROM ", t, ")>5 THEN");
    PREPARE query FROM @q; EXECUTE query; 
        DEALLOCATE PREPARE query;
        SELECT "That's a nice table!";
        INSERT INTO ... #and other behaviour other than SELECT
    SET @q:="END IF";
    PREPARE query FROM @q; EXECUTE query; DEALLOCATE PREPARE query;
END$$

由于它是在存储过程的上下文中执行的,所以我希望这可以工作。相反,当我CALL testif("t1");时,我收到此语法错误:

ERROR 1064 (42000): 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 (SELECT COUNT(*) FROM t1)>5 THEN' at line 1

如果我在程序之外运行查询,我会得到。

为了记录,我知道如何在没有直接PREPARE IF子句的情况下使这个查询工作。我的问题纯粹是出于好奇,因为我已经习惯了{ {1}} - 类似的函数在其他编程语言中工作(它执行字符串就像在该行上硬编码一样)。设置变量和大多数其他事情都可以使用eval,但是再次,它们也可以在过程之外工作。为什么不呢?

0 个答案:

没有答案