好的,我现在只想找个工作。有人可以指导我吗?
修改
好吧,很明显,没有办法在MySql中调用动态程序
但我真的需要动态地做这个select语句!
SELECT Location FROM DemoTable WHERE No_of_Hospitals > AvgCity(No_of_Hospitals)
或者找到更好的方法来解决这个问题。 AvgCity()中的参数将始终是动态的。那是强制性的。参数传递将是DemoTable中列的名称。 我需要一种有效的方法来处理规则表和DemoTable中的规则,如下所述。 现在已经3天了,我一直坚持这个。 帮助!! :■
作为参考,这是我遇到的老问题。到目前为止我所做的一切都在流动 -
旧问题:
有人可以帮我解决这个问题吗?
我是MySql的新手,我似乎无法在任何地方找到一个简单的答案
我有两张桌子正在和我一起工作。第一个表包含许多填充了Integer值的列,例如:
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()
是一个函数,而不是一个过程。
更新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:=@C1;
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)
有人可以为此设置小额奖金吗?我现在一个多星期没有得到一个答案。 :(
答案 0 :(得分:0)
我只是将整个查询放在一个字符串中(带有concat,包括表名)并执行。