今晚的最后一个问题,仍然使用 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);
冷融合错误说:
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 内部相同的名称,或者正确的顺序就足够了?
更重要的是,我可以像这样动态设置输出变量吗?如果不是,除了调用存储过程三次之外还有其他方法吗?
最佳答案
我从来不喜欢这样做的变量返回方式。有用但通常很困难(取决于顺序等)。
我有 2 条建议给你。
首先,将输出设为数据集。在您的存储过程中创建一个临时表(#myMinMax 或其他),其中最小和最大 2 列 - 使用插入填充该表,然后将其选择出来,将其返回为 <cfstoredprocresult..>
其次,我可能会创建一个存储过程,它执行循环并返回带有“类型”列的整个数据集...因此您最终会得到一个具有最小类型(如 A 中)(如 10 中)的数据集和最大值(如 100)... A 一行,B 一行,C 一行。与数据源的单个连接可以为您返回此数据集 - 避免 3 个(或更多)数据库调用。
关于mysql - 我可以在 cfloop 中调用存储过程并在 Coldfusion 中输出动态输出参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11004020/