【发布时间】:2018-10-25 15:40:04
【问题描述】:
我想在 Coldfusion 中循环存储过程。我有下面的代码来循环查询。
<cfquery name="rates" dbtype="query">
select code, rate
from application.qry.currency
where code = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.origCode#" />
or code = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.toCode#" />
</cfquery>
<cfloop query="rates">
<cfscript>
if (code == arguments.origCode) origRate = rate;
if (code == arguments.toCode) toRate = rate;
</cfscript>
</cfloop>
现在查询被下面的存储过程替换了,我想做与上面代码相同的函数用于循环。在存储过程中,我确实有与上面相同的查询。先感谢您!
<cfstoredproc procedure="usp_get_rates" datasource="#variables.dsn#">
<cfprocparam cfsqltype="cf_sql_varchar" dbvarname="@origCode" type="in" value="#arguments.origCode#"/>
<cfprocparam cfsqltype="cf_sql_varchar" dbvarname="@toCode" type="in" value="#arguments.toCode#" />
</cfstoredproc>
上面的完整代码:
<cffunction name="convertCurrency" access="public" output="false" returntype="string">
<cfargument name="amount" required="true" type="numeric" />
<cfargument name="origCode" required="true" type="string" />
<cfargument name="toCode" required="true" type="string" />
<cfscript>
var theAmount = 0;
var origRate = 0;
var toRate = 0;
var baseVal = 0;
var newVal = 0;
if (isNumeric(arguments.amount)) theAmount = arguments.amount;
if (arguments.origCode == 'USD' && arguments.toCode == 'USD' || theAmount == 0) return theAmount;
if (not isDefined("application.qry.currency")) initCurrencyRecordset();
</cfscript>
<cfquery name="rates" dbtype="query">
select code, rate
from application.qry.currency
where code = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.origCode#" />
or code = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.toCode#" />
</cfquery>
<cfloop query="rates">
<cfscript>
if (code == arguments.origCode) origRate = rate;
if (code == arguments.toCode) toRate = rate;
</cfscript>
</cfloop>
<cfscript>
if (origRate neq 0){
baseVal = theAmount * (1 / origRate);
newVal = baseVal * toRate;
}
else {
baseVal = theAmount * 1;
newVal = baseVal * toRate;
}
return newVal;
</cfscript>
<cffunction name="initCurrencyRecordset" access="private" output="false" returntype="void">
<!--- <cfquery name="qry" datasource="#variables.dsn#">
select distinct c.LOCAL_CUR as code, ISNULL(c.LocalConversionToUSD, c.x) as rate
from SCS_FM.dbo.currency c
join scs_fm.dbo.currency_code cc
ON c.local_cur = cc.currency_code
order by LOCAL_CUR
</cfquery> --->
<cfstoredproc procedure="usp_Rates_InitCurrencyRecordset_Qry" datasource="#variables.dsn#">
<cfprocresult name="qry" >
</cfstoredproc>
<cflock scope="application" type="exclusive" timeout="20">
<cfset application.qry.currency = duplicate(qry) />
</cflock>
</cffunction>
【问题讨论】:
-
如果你从 cfquery 内部调用 store proc 并用它替换你的 sql stackoverflow.com/a/4136859/3254405
-
你分享的代码是做什么的?它会抛出错误吗?它是否返回记录集?如果您转储结果
<cfdump var="#cfstoredproc#">,您会得到什么请在您的问题中包含这些详细信息。 -
什么版本的 ColdFusion 和哪个 DBMS?
dbvarname在 6-10 中被忽略,但在 CF11 中恢复。但是如果你在循环中使用脚本,你不妨把整个东西放在脚本中,然后在里面循环。 -
@Shawn 我使用的是 CF11,而 dbms 是 sql server 2014。我应该在这一行给出的名称而不是 rate -
. -
if (not isDefined("application.qry.currency")) initCurrencyRecordset();表示您正在寻找缓存在application范围内的查询对象。您可能应该将此查询对象传递到查询中,这样您就不会超出该函数来获取查询。此外,这似乎表明查询已经完成,因此您将无法转换为存储过程,除非您一直返回到application中的查询。不能从存储过程中查询 CF 查询。
标签: sql sql-server coldfusion adobe