问题描述
||
我已经创建了一个用于从FreeRADIUS访问记帐数据的存储过程,该存储过程已在MysqL Workbench中进行了测试,并且运行良好,但是当以cfquery / cfstoredproc身份运行时,出现错误“执行参数不正确”。
我已经检查了为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>
解决方法
问题是由生产线引起的
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;
并调用存储过程返回正确的结果。