我能够调用在CFLOOP和输出动态输出参数在ColdFusion中的存储过程?(Can I call

2019-10-16 20:35发布

最后一个问题今晚,依然采用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这三次获得变量A_min,A_max,B_min ...圈外。

但我有我的输出参数,这里面的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或者是正确的顺序就够了吗?
更重要的是,我可以设置输出变量的动态也是这样吗? 如果不是,是否有除了调用存储过程三个不同时代的任何其他方式?

Answer 1:

我从来不喜欢这样的可变回报的方式。 有用的,但往往很难(取决于顺序等)。

我对你有2项建议。

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

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



Answer 2:

在SQL Server中,我们设定的变量与在dbvarname属性@符号。

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

给一个尝试。

UPDATE〜我刚刚查了CF文档,建议上面不会帮你

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

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



Answer 3:

我与马克同意关于输出参数。 对于一个值,你可以去任何一种方式。 但除此之外,它更简单,只是返回一个结果。

错误执行数据库查询

这就是说 - 你的代码工作正常,在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 


文章来源: Can I call a stored procedure in a cfloop and output dynamic out-parameters in Coldfusion?