如何从CFC中的存储过程返回多个结果?

时间:2015-07-31 18:35:12

标签: stored-procedures coldfusion coldfusion-10 coldfusion-11

我在returning multiple stored procedure result sets from a cfc看到了一个相同的问题,但我找不到合适的解决方案。

我有一个返回大约8个结果/查询的SP。我想将查询输出到可由其他函数返回的变量中。这就是我的意思:

<cffunction name="AllOrders" returntype="query">
  <cfstoredproc procedure="SELAllOrders" datasource="mydb">
   <cfprocresult name="rsClosedOrders" resultset="1">
   <cfprocresult name="rsOpenOrders" resultset="2">
   <cfprocresult name="rsPendingOrders" resultset="3">
   <cfprocresult name="rsPaidOrders" resultset="4">
  </cfstoredproc>
</cffunction>
<!--- GET A RESULT TO RETURN TO CALLING PAGE --->
<cffunction name="GetClosedOrders" returntype="query">
   <!--- How do I return the result/query from the above CFC named rsClosedOrders from here? ---!>
<cfreturn rsClosedOrders/>
</cfunction>

如何从rsClosedOrders函数中获取AllOrders()结果,并将其提供给其他方法,在本例中为GetClosedOrders()

2 个答案:

答案 0 :(得分:2)

这基本上是Leigh在上面描述的并且应用了适当的var范围。请注意,这是您要求的,但它不是一种非常有效的方法。我会将存储过程分解为单独的过程,或者只是消除它并将查询直接放在代码中。

<cffunction name="AllOrders" returntype="struct">
  <cfset local.resultSets = {}>
  <cfstoredproc procedure="SELAllOrders" datasource="mydb">
   <cfprocresult name="local.resultSets.rsClosedOrders" resultset="1">
   <cfprocresult name="local.resultSets.rsOpenOrders" resultset="2">
   <cfprocresult name="local.resultSets.rsPendingOrders" resultset="3">
   <cfprocresult name="local.resultSets.rsPaidOrders" resultset="4">
  </cfstoredproc>
  <cfreturn local.resultSets>
</cffunction>

<cffunction name="GetClosedOrders" returntype="query">
  <cfset local.resultSets = AllOrders()>
  <cfreturn local.resultSets.rsClosedOrders/>
</cfunction>

<cffunction name="GetOpenOrders" returntype="query">
  <cfset local.resultSets = AllOrders()>
  <cfreturn local.resultSets.rsOpenOrders/>
</cfunction>

<cffunction name="GetPendingOrders" returntype="query">
  <cfset local.resultSets = AllOrders()>
  <cfreturn local.resultSets.rsPendingOrders/>
</cfunction>

<cffunction name="GetPaidOrders" returntype="query">
  <cfset local.resultSets = AllOrders()>
  <cfreturn local.resultSets.rsPaidOrders/>
</cfunction>

答案 1 :(得分:1)

有几种方法可以解决这个问题。

  1. 您可以重构存储过程,以便它不会返回8个不同的结果集,然后只需调用您需要的存储过程。

  2. 您可以调用返回所有8个集合的SP,然后使用您需要的集合,如下所示:

    <cffunction name="getClosedOrders" returntype="query">
        <cfstoredproc procedure="SELAllOrders" datasource="mydb">
            <cfprocresult name="rsClosedOrders" resultset="1">
        </cfstoredproc>
    
        <cfreturn rsClosedOrders>
    </cffunction>
    
  3. 基本上创建一个只返回八个结果集的函数。但这非常低效。