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

Stored procedures 如何从CFC中的存储过程返回多个结果?,stored-procedures,coldfusion,coldfusion-10,coldfusion-11,Stored Procedures,Coldfusion,Coldfusion 10,Coldfusion 11,我在这里看到了一个相同的问题,但我无法找到一个好的解决方案 我有一个SP,它返回大约8个结果/查询。我想将查询输出到其他函数可以返回的变量中。这就是我的意思: <cffunction name="AllOrders" returntype="query"> <cfstoredproc procedure="SELAllOrders" datasource="mydb"> <cfprocresult name="rsClosedOrders" results

我在这里看到了一个相同的问题,但我无法找到一个好的解决方案

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

<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>



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

  • 您可以重构存储过程,使其不返回8个不同的结果集,然后只调用所需的存储过程

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

    <cffunction name="getClosedOrders" returntype="query">
        <cfstoredproc procedure="SELAllOrders" datasource="mydb">
            <cfprocresult name="rsClosedOrders" resultset="1">
        </cfstoredproc>
    
        <cfreturn rsClosedOrders>
    </cffunction>
    
    
    

  • 基本上是创建一个只返回八个结果集中的一个结果集的函数。但是,这是非常低效的。

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

  • 您可以重构存储过程,使其不返回8个不同的结果集,然后只调用所需的存储过程

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

    <cffunction name="getClosedOrders" returntype="query">
        <cfstoredproc procedure="SELAllOrders" datasource="mydb">
            <cfprocresult name="rsClosedOrders" resultset="1">
        </cfstoredproc>
    
        <cfreturn rsClosedOrders>
    </cffunction>
    
    
    

  • 基本上是创建一个只返回八个结果集中的一个结果集的函数。但是,这是非常低效的。

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

  • 您可以重构存储过程,使其不返回8个不同的结果集,然后只调用所需的存储过程

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

    <cffunction name="getClosedOrders" returntype="query">
        <cfstoredproc procedure="SELAllOrders" datasource="mydb">
            <cfprocresult name="rsClosedOrders" resultset="1">
        </cfstoredproc>
    
        <cfreturn rsClosedOrders>
    </cffunction>
    
    
    

  • 基本上是创建一个只返回八个结果集中的一个结果集的函数。但是,这是非常低效的。

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

  • 您可以重构存储过程,使其不返回8个不同的结果集,然后只调用所需的存储过程

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

    <cffunction name="getClosedOrders" returntype="query">
        <cfstoredproc procedure="SELAllOrders" datasource="mydb">
            <cfprocresult name="rsClosedOrders" resultset="1">
        </cfstoredproc>
    
        <cfreturn rsClosedOrders>
    </cffunction>
    
    
    

  • 基本上是创建一个只返回八个结果集中的一个结果集的函数。然而,这是非常低效的。

    这基本上就是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>
    

    这基本上就是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>
    

    这基本上就是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>
    

    这基本上就是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>
    
    
    
    答案与另一个线程上的答案相同。在AllOrders中,运行proc。将所有结果集放入一个结构中。让函数返回该结构。从另一个函数中调用Allorder并提取包含所需结果集的键。显然,这有点浪费,因为无论是否使用,它每次都从db检索所有八个结果集。但是,除非重新设计存储过程,否则您对此无能为力。另请注意,如果以上不是psuedo代码,请确保
    var/local
    对所有函数局部变量(包括结果)进行范围分析为避免潜在的线程问题,它返回多个结果集的原因是调用页要求同时显示所有这些数据以显示订单计数(类似于Outlook显示您有多少电子邮件,例如,
    收件箱(45)
    )。这也是许多返回多个结果的SP之一。另一个示例是主
    产品
    页面,该页面返回基本信息、技术表、注释和历史查询。将所有这些都放在一个SP中是有意义的,因为这一切都与
    产品
    页面有关。这取决于具体情况。仅仅因为数据是相关的,并不意味着它应该总是分组并一起返回。例如,如果您有多个组件访问不同的产品信息,那么每次只返回所需的内容比返回所有内容更有意义。也就是说,返回一堆“计数”是有意义的,即收件箱(45个)、已发送(55个)等等。。。作为一个群体。但是,通常情况下,您会将计数作为单个resultset中的独立列返回,而不是每个计数返回一个resultset。但是,这一切都取决于……答案与另一条线索上的答案相同。在AllOrders中,运行proc。将所有结果集放入一个结构中。让函数返回该结构。从另一个函数中调用Allorder并提取包含所需结果集的键。显然,这有点浪费,因为无论是否使用,它每次都从db检索所有八个结果集。但是,除非重新设计存储过程,否则您对此无能为力。请注意,如果上面的代码不是psuedo代码,请确保
    var/local
    scope所有函数local variab