0

今晚的最后一个问题,仍然使用 Coldfusion8 和 MySQL。

我有一个产品表,每个产品都有价格 A、B 和 C。我需要检索所有价格中 A、B、C 的最小值和最大值(A_min、A_max、B_min、B_max、C_min、C_max)

我想我会创建一个存储过程并像这样遍历 A、B、C:

  <cfloop list="A,B,C" index="what" delimiters=",">
    <cfstoredproc procedure="proc_search_select_minmax" datasource="dtb">
        <cfprocparam type="in" value="#what#" cfsqltype="cf_sql_varchar" maxlength="15">
        <cfprocparam type="in" value="#variables.xxx#" cfsqltype="cf_sql_varchar" maxlength="13">
        <cfprocparam type="in" value="#variables.yyy#" cfsqltype="cf_sql_varchar" maxlength="13">
        <cfprocparam type="in" value="#variables.zzz#" cfsqltype="cf_sql_text" maxlength="4">
        <cfprocparam type="out" cfsqltype="cf_sql_decimal" variable="#what#_min">
        <cfprocparam type="out" cfsqltype="cf_sql_decimal" variable="#what#_max">   
     </cfstoredproc>
  </cfloop>

所以我们的想法是为 A、B 和 C 运行 3 次,并让变量 A_min、A_max、B_min... 退出循环。

但是我的 out-parameters 有问题,在 MySQL 中,我声明如下:

 CREATE ... PROCEDURE `proc_search_select_minmax`(..., OUT `outputMin` DECIMAL(12,2), OUT `outputMax` DECIMAL(12,2))

 .... 
 SET outputMin = min(what);
 SET outputMax = max(what);

Coldfusion错误说:

Error Executing Database Query
@
<cfprocparam type="out" cfsqltype="cf_sql_decimal" variable="#what#_min">
<cfprocparam type="out" cfsqltype="cf_sql_decimal" variable="#what#_max">

问题:
我是否必须为我的输出参数提供与 MySQL 内部相同的名称,或者正确的顺序是否足够?
更重要的是,我可以像这样动态设置输出变量吗?如果没有,除了调用存储过程三次之外,还有其他方法吗?

4

3 回答 3

2

我从不喜欢这样做的可变返回方式。有用但通常很困难(取决于订单等)。

我有 2 条建议给你。

首先,使输出成为一个数据集。在您的存储过程中创建一个临时表(#myMinMax 或其他),最小和最大 2 列 - 用插入填充表,然后选择它作为返回<cfstoredprocresult..>

其次,我可能会创建一个存储过程来执行循环并返回带有“类型”列的整个数据集......所以你最终会得到一个数据集类型(如 A)最小值(如 10)和最大值(如 100) ... A 行,B 行,C 行。与数据源的单个连接可以为您返回此数据集 - 避免 3 个(或更多)数据库调用。

于 2012-06-12T22:02:27.370 回答
0

在 SQL Server 中,我们在 dbvarname 属性中使用 @ 符号设置变量。

<cfprocparam cfsqltype="cf_sql_integer" 
    value="#LOCAL.User_ID#" 
    dbvarname="@User_ID">

试试看。

更新~我刚刚检查了 CF 文档,上面的建议对你没有帮助

http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_p-q_14.html

更改了 dbvarname 属性行为:现在所有驱动程序都忽略它。ColdFusion 使用 JDBC 2.2,不支持命名参数。

于 2012-06-12T20:17:41.150 回答
0

我同意 Mark 关于输出参数的观点。对于单个值,您可以采用任何一种方式。但除此之外,只返回结果集更简单。

执行数据库查询时出错

也就是说 - 您的代码可以在 CF8/MySQL5 中使用下面的示例过程。根据部分错误消息,我怀疑真正的问题是您的过程中的语法错误。您是否直接在数据库中对其进行了测试?

<cfloop>
    <cfstoredproc ...>
        ....
    </cfstoredproc>
</cfloop>
<cfoutput>
    #a_min# #a_max# <br />
    #b_min# #b_max# <br />
    #c_min# #c_max# <br />
</cfoutput>


CREATE PROCEDURE `test`.`proc_search_select_minmax` (
     what varchar(50)
     , xxx varchar(50)
     , yyy varchar(50)
     , zzz varchar(50)
     , OUT outputMin decimal(12,2)
     , OUT outputMax decimal(12,2)
 )
BEGIN

      SET outputMin = 1;
      SET outputMax = 20;
END 
于 2012-06-14T07:39:19.637 回答