2017-05-06 70 views
0

我想写MySQL的功能是这样的:MySQL的:变量没有在SELECT语句扩大存储功能

DELIMITER // 
CREATE FUNCTION getVal(col varchar(50), xid int, reverse boolean) RETURNS double 
DETERMINISTIC 
READS SQL DATA 
BEGIN 
    declare res DOUBLE DEFAULT 0; 
    SELECT col INTO res FROM col WHERE id = xid; 
    IF(revrese = 1) THEN 
     RETURN 1 - res; 
    END IF; 

    RETURN res; 
END// 
DELIMITER ; 

然而,当我执行这样的:

SELECT getVal("size", 1, 0); 

的变量col不扩展,并且查询返回表'col'不存在的错误 - 它实际上没有。我怎样才能使这段代码正常工作?

+1

你试图用'SELECT'查询来实现什么? –

回答

2

您必须使用准备好的语句来即时建立您的声明。

DELIMITER // 
CREATE FUNCTION getVal(col varchar(50), xid int, reverse boolean) RETURNS double 
DETERMINISTIC 
READS SQL DATA 
BEGIN 
    declare res DOUBLE DEFAULT 0; 
    SET @sql = CONCAT('SELECT ', col, ' INTO res FROM ', col, ' WHERE id = ', xid); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

    IF(reverse = 1) THEN 
     RETURN 1 - res; 
    END IF; 

    RETURN res; 
END// 
DELIMITER ; 
+0

如果只有MySQL允许在存储过程中使用动态SQL,这将会很棒。正如我刚发现它不会,并试图运行您的代码结果:“动态SQL不允许存储函数或触发器”。 –

+0

@JanKoutný,存储在*程序*中。但不是功能或触发器。您可以从存储函数内调用存储过程,但在该上下文中,动态SQL也是不允许的。 –