将列名作为参数传递给mysql存储函数

时间:2014-06-30 09:51:58

标签: mysql stored-procedures

我正在使用MySQL存储函数,我创建了一个函数,并且我已将列名作为参数传递给此函数。假设

CREATE DEFINER=`root`@`localhost` FUNCTION `test_func`(column_1 varchar(100)) RETURNS varchar(100) CHARSET latin1

select column_1 from table where id = 1 ;

在这里,我想获得列' column_1'的值。 id为1.但是我得到的列名本身并不是值。

请帮我写出正确的语法。

3 个答案:

答案 0 :(得分:3)

您的方法存在一些问题。首先,您不能使用您的参数 value 来引用基础列。好的是,您可以使用Prepared Statements作为解决方法。

第二个问题是MySQL功能不允许使用Prepared Statements。要解决该限制,您需要使用存储过程。举个例子:

CREATE PROCEDURE test_func (IN col1 varchar(100), OUT res int)
BEGIN

SET @s=CONCAT('SELECT ',col1,' INTO @res FROM yourtable WHERE id=1');
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

SELECT @res INTO res;

END

答案 1 :(得分:1)

经过长时间的搜索后,我发现存储的函数只能用于返回单个值或计算出的答案(算术)。对于您的查询,只需使用存储过程。它就像从前端创建查询一样简单。这是语法:

使用CONCAT(X1,X2,X3 . . .)按您的意愿执行此操作。

CREATE DEFINER=`root`@`localhost` PROCEDURE `Test`(table longtext,column longtext,e_id longtext)

SET @s=CONCAT('Select ',table,' from ', column, 'Where employee = ',e_id);

PREPARE stmt1 FROM @s;

EXECUTE stmt1;

DEALLOCATE PREPARE stmt1;

END

答案 2 :(得分:0)

我不确定你要问的是什么。但是这是一个使用预备语句的解决方案:

SET @selectStatement = CONCAT('Select ', columnName1,' from tab1 where id = 1'); -- Build Select statement like this
PREPARE stmt FROM @selectStatement; -- parse and prepare insert statement from the above string 
EXECUTE stmt; -- execute statement
DEALLOCATE PREPARE stmt; -- release the statement memory.

我不知道完整的情况,但可以通过更改某些设计来避免这种情况。