好吧,我現在只想找一份工作。有人能指導我嗎?如何將動態列名稱傳遞給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