2016-01-04 33 views
-1

我正在嘗試編寫MySql函數,我在select語句中使用了表名,這是一個解釋我面臨的問題的玩具代碼[注意:我不想使用程序!]傳遞列名作爲MySql函數的參數

DROP FUNCTION IF EXISTS `P_AVG`; 
DELIMITER $$ 
CREATE FUNCTION P_AVG(tblName CHAR(64)) RETURNS INT 
BEGIN 
    DECLARE cnt INT; 
SELECT COUNT(*) INTO cnt FROM tblName; 
return cnt; 
END$$ 
DELIMITER ; 

然後我嘗試執行以下

SELECT P_AVG("PARTSUPP"); 

我收到以下錯誤

ERROR第1146(42S02) :表'phpmyadmin.tblName'不存在

回答

0

創建一個全局變量以動態組合SQL查詢,然後讓MySQL從組合的SQL查詢字符串中準備一個語句並以預準備語句的形式動態執行它。

由於動態SQL不允許在存儲函數中,所以您需要執行存儲過程。

這應該爲你做: -

DROP PROCEDURE IF EXISTS `P_AVG`; 
DELIMITER $$ 
CREATE PROCEDURE P_AVG(tblName CHAR(64)) 
BEGIN 
    DECLARE cnt INT DEFAULT 0; 
    IF CHAR_LENGTH(tblName) > 0 THEN 
     SET @DYNAMIC_QUERY = CONCAT('SELECT COUNT(*) INTO cnt FROM ', tblName); 
     PREPARE STMNT FROM @DYNAMIC_QUERY; 
     EXECUTE STMNT; 
     DEALLOCATE PREPARE STMNT; 
    END IF; 
    SELECT cnt; /* The return statement becomes a regular `SELECT` statement, 
       although an OUT parameter also can be used instead. */ 
END$$ 
DELIMITER ; 

CALL P_AVG('ACCOUNT'); -- Example procedure call 
+0

它生成以下錯誤ERROR 1064(42000):你在你的SQL語法錯誤;查看與您的MySQL服務器版本相對應的手冊,以找到在'DYNAMIC_QUERY;'附近使用的正確語法。 –

+0

o.O another:錯誤1336(0A000):動態SQL不允許在存儲函數或觸發器中 –

+0

然後,您需要將其作爲存儲過程編寫。一個'PROCEDURE'而不是'FUNCTION'。 – SarathChandra