2016-01-04 2 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"); 

Я получаю следующую ошибку

ОШИБКА 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

он выдаст следующую ошибку ОШИБКА 1064 (42000): У вас ошибка в вашем SQL синтаксиса; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'DYNAMIC_QUERY; –

+0

o.O another: ERROR 1336 (0A000): динамический SQL не разрешен в сохраненной функции или триггера –

+0

Затем вам нужно записать его как хранимую процедуру. «ПРОЦЕДУРА» вместо «ФУНКЦИЯ». – SarathChandra

Смежные вопросы