微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查询在Workbench中有效,但在ColdFusion中返回错误

如何解决查询在Workbench中有效,但在ColdFusion中返回错误

|| 我已经创建了一个用于从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;
并调用存储过程返回正确的结果。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。