0

FreeRADIUSからアカウンティングデータにアクセスするためのストアドプロシージャを作成しました。これはMySQLWorkbenchでテストされ、正常に実行されますが、cfquery / cfstoredprocとして実行すると、「EXECUTEへの引数が正しくありません」というエラーが発生します。

ドライバがMySQL4/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>
4

1 に答える 1

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;

ストアドプロシージャを呼び出すと、正しい結果が返されました。

于 2011-06-24T01:29:49.070 に答える