2017-05-06 87 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也是不允許的。 –