coldfusion - 从 cfc 返回多个存储过程结果集

标签 coldfusion cfc

我正在尝试将我的应用程序中的一些页面转换为使用 cfc,一个页面使用存储过程来检索几组数据。

现在,当我访问结果时,它们就像我使用 <cfquery> 一样。标签,以及提供的所有功能。所以现在我试图在我正在构建的 cfc 中使用这个相同的存储过程,我希望能够以相同的方式访问结果,这就是我的问题所在。我不确定如何从函数返回多个查询,而不创建我已经开始的数组。顺便说一下,功能不完整。我只是想让一些东西起作用。在下面的设置中,我得到了一组查询对象,但我觉得有更好的方法来做到这一点。

这是<cffuntion> :

<cffunction name="getProfileData" 
            access="public" 
            output="false" 
            returntype="string">

    <cfargument name="cusip" type="string" required="true">
    <cfargument name="report_date" type="date" required="true">
    <cfset var errorMessage = "everything is good">

    <cftry>
        <cfstoredproc datasource="#dsn#" procedure="prc_asset_profile_retrieve">
            <cfprocparam type="in" cfsqltype="cf_sql_varchar" value="#cusip#" dbvarname="@cusip">
            <cfprocparam type="in" cfsqltype="cf_sql_varchar" value="#report_date#" dbvarname="@reportDate">
            <cfprocresult name="profile_head" resultset="1">
            <cfprocresult name="attribution" resultset="2">
            <cfprocresult name="characteristics" resultset="3">
            <cfprocresult name="exposure" resultset="4">
            <cfprocresult name="weights" resultset="5">
            <cfprocresult name="holdings" resultset="6">
        </cfstoredproc>

        <cfset var profileArray = []>
        <cfset #ArrayAppend(profileArray,profile_head)#>

        <cfcatch type="any">
            <cfset errorMessage = "something happened">
        </cfcatch>          
    </cftry>

    <cfreturn profileArray>
</cffunction>

当我输出一些测试数据时,它匹配
<cfset count = fund_profile.getProfileData("#cusip#","#report_date#")> 
<cfdump var="#count[1]#">
<cfoutput>
    From cfc (##count[1].recordCount##): #count[1].recordCount#<br>
    From stored proc (##profile_head.recordCount##): #profile_head.recordCount#
</cfoutput>

我得到:

来自 cfc (#count[1].recordCount#): 1
从存储过程(#profile_head.recordCount#):1

但第二种方式看起来更干净。
   -----------------------------WORKING SOLUTION------------------------------ 

所以在处理了@leigh 的答案之后,我想出了这个。

这是完整的 cfc:
<cfcomponent displayname="Fund Profile" hint="This is the cfc that will do the processing of all fund profile information" output="false">
     <cfproperty name = "result1"> <!--- PROFILE HEAD --->
     <cfproperty name = "result2"> <!--- ATTRIBUTION --->
     <cfproperty name = "result3"> <!--- CHARACTERISTICS --->
     <cfproperty name = "result4"> <!--- EXPOSURE --->
     <cfproperty name = "result5"> <!--- WEIGHTS --->
     <cfproperty name = "result6"> <!--- HOLDINGS --->

     <cffunction name="init" 
            displayname="init" 
            hint="This will initialize the object" 
            access="public" 
            output="false" 
            returnType="Any">

        <cfargument name="dsn"  type="string" required="true" />
        <cfargument name="cusip" type="string" required="true" />
        <cfargument name="report_date" type="date" required="true" />

        <cfset variables.dsn = #arguments.dsn#>
        <cfset variables.cusip = #arguments.cusip#>
        <cfset variables.report_date = #arguments.report_date#>

        <cfscript>
            getProfiledata(cusip,report_date);
        </cfscript>     

        <cfreturn this>
    </cffunction>

    <cffunction name="getProfileData" 
            access="private" 
            output="false" 
            returntype="void">

        <cfargument name="cusip" type="string" required="true">
        <cfargument name="report_date" type="date" required="true">

        <cfstoredproc datasource="#dsn#" procedure="prc_asset_profile_retrieve">
             <!--- STORED PROCEDURE HASN'T CHANGED.  SEE ABOVE FOR CODE --->
        </cfstoredproc>

        <cfscript>
            setProfilehead(profile_head);
            setAttribution(attribution);
            setCharacteristics(characteristics);
            setExposure(exposure);
            setWeights(weights);
            setHoldings(holdings);
        </cfscript>

        <cfreturn>
    </cffunction>

    <!--- NOT GOING TO INCLUDE ALL SETTERS AND GETTERS, --->
    <!--- BECAUSE THEY ARE ALL THE SAME OTHER THAN THE NAMES --->

    <cffunction name="setProfileHead" access="private">
        <cfargument name="ProfileHead">
        <cfset variables.result1 = arguments.ProfileHead>       
    </cffunction>

    <cffunction name="getProfileHead" access="public" returntype="query">
        <cfreturn variables.result1>
    </cffunction>

</cfcomponent>

这是调用页面的代码:
<cfset fund_profile = CreateObject("component", "CFCs.fund_profile").init("#dsn#","#cusip#","#report_date#")>
<cfset profile_head = fund_profile.getProfileHead()>

抱歉所有代码,但我想让代码可用。那么有没有人看到我提出的任何问题?

最佳答案

一个函数只能返回一个值。如果您希望返回多个值,您将需要使用某种类型的复杂对象(数组、结构等)。如果数组不够直观,您可以将查询放在一个结构中并返回。然后调用页面可以通过名称而不是索引访问查询。

(旁注,一定要正确地改变范围/本地化所有函数变量。)

 <cfset var data = {}>
 ...
 <!--- store query results in structure --->
 <cfset data.profile_head = profile_head>
 <cfset data.attribution = attribution>
 ... 
 <cfset data.holdings = holdings>
 <!--- return structure --->
 <cfreturn data>

关于coldfusion - 从 cfc 返回多个存储过程结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9982918/

相关文章:

sql - 如何在多个列上对我的 cfquery 进行分组?

variables - cfproperty 标记定义变量和coldfusion 中的变量范围变量有什么区别?

coldfusion - 如何在不使用 cfinvoke 的情况下在 CFC 上运行静态方法?

excel - 无法使用 ColdFusion 创建正确的 Excel 电子表格

php - 将 PHP foreach 循环转换为 ColdFusion

loops - ColdFusion 中是否存在 "loop"范围?

coldfusion - ColdFusion cfc 方法可以确定自己的名称吗?

inheritance - ColdFusion 组件继承其他组件的功能

file-upload - cfc 文件中的 Coldfusion FileUpload 函数不起作用

coldfusion - 如何修剪没有任何空格的字符串