[英]How to loop through stored procedure result in coldfusion
我想在 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>
根據到目前為止的詳細信息,要完成您的要求.....
我假設您的存儲過程如下所示:
CREATE PROCEDURE dbo.usp_get_rates @origCode varchar(20), @toCode varchar(20)
AS
BEGIN
SET NOCOUNT ON ;
SELECT code, rate
FROM dbo.currency
WHERE code IN ( @origCode, @toCode )
END;
GO
注意:您想用合適的數據庫架構替換“dbo”。 但是,如果您要跨數據庫查詢(請參閱上面關於application.qry.currency
評論),那么您將保持您的FROM
調用相同,並將您的存儲過程放置/引用到適當的架構中。
使用該過程,您的 ColdFusion 代碼將類似於:
<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#">
<cfprocresult name="rates">
</cfstoredproc>
<cfscript>
// Initialize your variables. They won't exist if your query has 0 rows.
var origRate = 0 ; // Or expected datatype
var toRate = 0 ; // Or expected datatype
for (var thisrow in rates) {
if ( thisrow.code == arguments.origCode ) { origRate = thisrow.rate ; }
if ( thisrow.code == arguments.toCode) { toRate = thisrow.rate ; }
}
</cfscript>
由於您使用的是arguments
范圍,因此我假設此代碼位於函數內部。 這將允許您使用var
關鍵字。
請注意,自 CFMX 起dbvarname
被忽略並在 CF11 Update 3 中恢復-Dcoldfusion.ignoredbvarname
有一個 JVM 標志( -Dcoldfusion.ignoredbvarname
)來繼續忽略dbvarname
,但該標志在 CF2016+ 中被忽略。
您可以使用簡單的for
循環來遍歷查詢,但正如我上面所說,這可能不是您真正想要的。 如果您的查詢/sproc 返回多個結果,並且為它們返回多個值,它將覆蓋origRate
或toRate
。 即如果您的查詢有[{code:"x",rate:41},{code:"x",rate:42}]
,它將覆蓋code="x"
rate
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.