我在存储过程中测试了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
,但是再次,它们也可以在过程之外工作。为什么不呢?