2011-06-23 6 views
0

FreeRADIUSの会計データにアクセスするためのストアドプロシージャを作成しました。これはMySQL Workbenchでテストされていますが、正常に動作しますが、cfquery/cfstoredprocとして実行すると、 EXECUTE 'の引数が正しくありません。QueryはWorkbenchで動作しますが、ColdFusionでエラーを返します

ドライバがMySQL 4/5用に設定されていることを確認しました(データベースはMySQL 5です)。以下のようにcfqueryparamを使用せずにMySQL Workbenchから呼び出しをコピーして貼り付けましたが、 。

ストアドプロシージャは、私が使用していますこれを呼び出すには

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

データ接続が正しいDBスキーマを指していますか? – Limey

+1

CF9/mySQL5.1.42で動作します。しかし、あなたの 'EXECUTE stmt USING ...'ステートメントではすべての変数が考慮されていますか?それが 'EXECUTEへの不正な引数'エラーの1つの原因です。 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

Ohh ..セッション変数のために@あなたは正しいと思います。 ms SQLの人も)http://stackoverflow.com/questions/1009954/mysql-variable-vs-variable-whats-the-difference/1010042#1010042しかし、あなたは 'どこuserName = UserNameは本当に働いているのですか?私は、変数と列名が異なる必要があると思うでしょう... – Leigh

+0

私は、ストアドプロシージャの外でクエリを実行した結果に対してこれをチェックし、うまく動作するように見えます。 –

関連する問題