好吧,我现在只想找一份工作。有人能指导我吗?如何将动态列名称传递给MySql中的函数参数?
编辑:
好了,所以apparantly有没有办法让一个函数来调用MySQL中的动态过程。
但我真的需要动态地做这个select语句!
SELECT Location FROM DemoTable WHERE No_of_Hospitals > AvgCity(No_of_Hospitals)
或者找到一个更好的方法来处理这个问题。 AvgCity()中的参数始终是动态的。这是强制性的。参数传递将是DemoTable中列的名称。 我需要一种有效的方式来处理规则表和DemoTable中的规则,如下所述。 现在已经3天了,我一直在这一点上。 帮助! :s
作为参考,这里是我遇到的老问题。一切的流程,我已经得到这样做的远
老问题:
能有人帮我出了一个好办法去了解呢? 我是MySql的新手,我无法在任何地方找到简单的答案。
我有两个表,我正在与。第一个表包含了很多诸如充满整数值列:
No_of_Hotels No_of_Hospitals
第二个表是一个规则表包含规则名称后面跟着实际的规则。
如:
ID RuleName Rule 1 Example No_of_Hospitals > AvgCity(No_of_Hospitals)
,我现在所拥有的功能是:
CREATE FUNCTION AvgCity(columnName text) RETURNS float(10)
DETERMINISTIC
BEGIN
DECLARE columnAvg float;
SELECT AVG(columnName)
INTO columnAvg
FROM DemoTable;
RETURN (columnAvg);
END
但每次我一值传递给函数参数的时间 - 这是一个列的名字我想要的平均数,我得到一个0
作为回报。
我想这是因为传递给AVG()
函数的参数作为字符串而不是列名传递。 那么这就是AVG("No_of_Hospitals")
而不是AVG(No_of_Hospitals)
,它也会返回0
。
如何解决此问题并获得结果?
我会结果后执行整个事情:
SELECT @Q:= CONCAT('SELECT Location FROM DemoTable WHERE ', Rules.Rule) FROM
Rules WHERE ID=1;
PREPARE stq FROM @Q;
EXECUTE stq;
DEALLOCATE PREPARE stq;
这一切都在SELECT语句的话,我确实需要AvgCity()
是一个功能,而不是一个过程。
UPDATE 1:
所以我决定把一个程序放在函数里面。
什么,我现在是这样的功能:
CREATE FUNCTION AvgCity(colName text) RETURNS float(10)
DETERMINISTIC
BEGIN
DECLARE colAvg float;
CALL AvgCityProcedure(colName,colAvg);
RETURN (colAvg);
END
并且这个过程:
CREATE PROCEDURE AvgCityProcedure(
IN colName VARCHAR(100),
OUT colAvg FLOAT)
BEGIN
SET @c1 = 0.0;
SET @M:= colName;
SET @QUERY:= CONCAT('SELECT AVG(',@M,') INTO @C1 FROM DemoTable');
PREPARE stmt FROM @QUERY;
EXECUTE stmt;
SET colAvg:[email protected];
SELECT colAvg;
END
更新2:我的程序工作!
遵循这个非常好的例子:
My SQL Dynamic query execute and get ouput into a variable in stored procedure
但我似乎无法管理到里面插入colAvg
任何价值。 我试了很多与@QUERY
的组合,但我找不到合适的组合。 我跟上ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1
结束了,但如果我删除INTO colAvg
一部分,只是做 SELECT @QUERY:= CONCAT('SELECT AVG(',@M,') FROM DemoTable');
它完全打印答案画面。我需要将其返回colAvg
。 我在做什么错?
好吧!我的程序正常工作! 我现在又遇到了另一个问题。 从我的函数返回值到过程时出现错误。
它说功能里面不允许动态sql。
但我用我的程序中的动态SQL:S
这里发生了什么?!
我需要它看起来像到底是:
SELECT Location FROM DemoTable WHERE No_of_Hospitals > AvgCity(No_of_Hospitals)
可能有人请建立一个小型的赏金对此有何看法?我现在还没有在一个多星期内得到答案。 :(
有步骤更换你的函数 – Mihai 2015-02-28 12:31:31
但我不能在SELECT语句中使用的过程。?小号 – MetalloyD 2015-02-28 12:34:47