【问题标题】:Query works in Workbench but returns error in ColdFusion查询在 Workbench 中有效,但在 ColdFusion 中返回错误
【发布时间】:2011-09-21 14:06:38
【问题描述】:

我创建了一个用于从 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>

【问题讨论】:

  • 您确定您的数据连接指向正确的数据库架构吗?
  • 它适用于我的 CF9/mySQL5.1.42。但是您的EXECUTE stmt USING ... 语句中是否考虑了所有变量?这是Incorrect arguments to EXECUTE 错误的原因之一。 rpbouman.blogspot.com/2005/11/…
  • @Leigh 是的,我很确定他们是。从 MySQL Workbench 调用例程工作正常。只有当我将查询移动到我的 CF9 安装时,我才会收到错误。
  • @Ryan - 只是笑着说,如果您注释掉动态 sql 部分并只运行基本的 proc shell,您还会收到错误吗?即CREATE PROCEDURE radius.GetUserDataUsageForMonth(IN StartDate DATE, IN EndDate DATE, IN UserName VARCHAR(100)) BEGIN END
  • @Ryan - 可能是驱动程序问题..?但是您是否尝试一次添加回语句。看看你是否能查明因果关系。 (可能不适用于你,但我也看到了这个问题bugs.mysql.com/bug.php?id=33851

标签: mysql coldfusion freeradius


【解决方案1】:

问题是在行中引起的

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;

调用存储过程返回了正确的结果。

【讨论】:

  • 哦..你是对的@是会话变量(我更像是一个 ms sql 人)stackoverflow.com/questions/1009954/… 但你确定WHERE userName = UserName 真的有效吗?我认为变量和列名需要不同...
  • 我已经根据在存储过程之外运行查询的结果检查了这一点,它看起来运行良好。
猜你喜欢
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 2019-06-17
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多