Нельзя использовать параметры для процедуры для имен столбцов или таблиц. Вместо этого вам нужно подготовить оператор с использованием этих значений и выполнить его. Например:
BEGIN
DECLARE uValue INT(11);
SET @sql = CONCAT('SELECT MAX(', uField, ') INTO uValue FROM ', uTable);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
RETURN uValue;
END
Обратите внимание, что вы не можете использовать Dynami c SQL в функции, поэтому вам необходимо преобразовать это в хранимую процедуру с параметром uValue
OUT
, т.е.
CREATE PROCEDURE DMax(
IN uField VARCHAR(100),
IN uTable VARCHAR(100),
OUT uValue <appropriate type>
)
BEGIN
DECLARE uValue INT(11);
SET @sql = CONCAT('SELECT MAX(', uField, ') INTO uValue FROM ', uTable);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
Тогда вам нужно будет вызвать процедуру, что-то вроде
CALL DMax('table1', 'column1', @DMax)
, и тогда вы сможете
SELECT @DMax
(да, это монументальная боль)