我已在phpMyAdmin中创建了一个函数,如此屏幕截图所示。
当我尝试像这样使用它时:
Select DMax ("id","customers")
我收到错误消息#1305,说uTable
不存在。这可能是一些基本的语法问题,因为sql语句中的uTable
是按字面意义使用的,而不是被视为参数。那我该如何运作呢?
您不能在过程中使用参数来获取列名或表名。相反,您需要使用这些值准备一条语句并执行该语句。例如:
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
请注意,您不能在函数中使用动态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
(是的,这是巨大的痛苦)