2011-06-23 33 views
0

我創建了一個存儲過程訪問來自FreeRADIUS的,已在MySQL工作臺經過測試,運行良好會計數據返回錯誤,但作爲一個CFQUERY/CFSTOREDPROC運行時,我得到的錯誤「 EXECUTE'的參數不正確。查詢工作在工作臺但在ColdFusion的

我檢查了爲MySQL 4/5(數據庫是MySQL 5)設置的驅動程序,並試圖從MySQL Workbench複製並粘貼調用,並且沒有使用如下所示的cfqueryparam而運行,但它仍然返回相同的錯誤。

存儲過程與

DELIMITER $$ 
CREATE PROCEDURE radius.GetUserDataUsageForMonth(IN StartDate DATE, IN EndDate DATE, IN UserName  
VARCHAR(100)) 
BEGIN 

SET @records = (SELECT COUNT(UserName) FROM `radius`.`radacct` WHERE userName = @UserName AND AcctStartTime BETWEEN @StartDate AND @EndDate) - 1; 

SET @SqlQuery = 'SELECT SUM(AcctOutputOctets) AS BytesIN, SUM(AcctInputOctets) AS BytesOUT FROM 
     (SELECT * FROM `radius`.`radacct` WHERE userName = @UserName AND AcctStartTime BETWEEN @StartDate AND @EndDate LIMIT ? 

     UNION ALL 

     SELECT * FROM `radius`.`radacct` WHERE userName = @UserName AND AcctStartTime < @StartDate ORDER BY AcctStartTime DESC LIMIT 1) AS Totals;'; 

PREPARE stmt FROM @SqlQuery; 
EXECUTE stmt USING @records; 
DEALLOCATE PREPARE stmt; 
END $$ 
DELIMITER ; 

創建要調用這個我使用:

<cfquery name="qRadAccount_currentData" datasource="#application.datasource_radius#"> 
    CALL radius.GetUserDataUsageForMonth('2011-06-01','2011-07-01','ryan.french'); 
</cfquery> 

我也曾嘗試

<cfstoredproc procedure="radius.GetUserDataUsageForMonth" datasource="#application.datasource_radius#" result="qRadAccount_currentData"> 
    <cfprocparam cfsqltype="cf_sql_date" value="2011-06-01"> 
    <cfprocparam cfsqltype="cf_sql_date" value="2011-07-01"> 
    <cfprocparam cfsqltype="cf_sql_varchar" value="ryan.french"> 
</cfstoredproc> 
+0

你確定你的數據連接指向正確的數據庫模式嗎? – Limey

+1

它適用於CF9/mySQL5.1.42。但是所有的變量在你的'EXECUTE stmt USING ...'語句中佔了嗎?這是「EXECUTE錯誤參數錯誤」的一個原因。 http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html – Leigh

+0

@Leigh是啊我很確定他們是。從MySQL Workbench調用例程工作正常。只有當我將查詢移動到我的CF9安裝中時,纔會出現錯誤。 –

回答

0

這個問題是在該行

引起
SET @records = (SELECT COUNT(UserName) FROM `radius`.`radacct` WHERE userName = @UserName AND AcctStartTime BETWEEN @StartDate AND @EndDate) - 1; 

當作爲查詢運行,這將返回正確的值,但是當值傳遞在從ColdFusion的存儲過程,結果是-1(從查詢中沒有發現行)。

我大多經營MS SQL,但我相信,在MySQL中@符號定義了一個局部或會話變量。因此,從ColdFusion調用變量時不存在,導致錯誤。

我取代上面

SET @records = (SELECT COUNT(UserName) FROM `radius`.`radacct` WHERE userName = UserName AND AcctStartTime BETWEEN StartDate AND EndDate) - 1; 

並調用存儲過程返回正確的結果的行。

+0

哦..你是對的@爲會話變量(我更多的是一個MS SQL人太)http://stackoverflow.com/questions/1009954/mysql-variable-vs-variable-whats-the-difference/1010042#1010042但你確定'WHERE userName = UserName'真的工作嗎?我會認爲變量和列的名稱將需要不同... – Leigh

+0

我已經檢查了這種結果從在存儲過程之外運行查詢的結果,它看起來運行良好。 –

相關問題