возврат нескольких результирующих наборов хранимых процедур из cfc - PullRequest
3 голосов
/ 02 апреля 2012

Я пытаюсь преобразовать некоторые страницы из моего приложения в файлы cfc, и одна страница использует хранимую процедуру для получения пары наборов данных.

Теперь, когда я получаю доступ к результатам, они действуют какесли бы я использовал тег <cfquery>, и все функции, которые дает.Поэтому сейчас я пытаюсь использовать эту же хранимую процедуру в создаваемом мной коде, и я хотел бы иметь возможность получить доступ к результатам таким же образом, и в этом заключается моя проблема.Я не уверен, как вернуть несколько запросов из функции, не создавая массив, который я начал.Кстати, функция неполная.Я просто пытался заставить что-то работать.В приведенной ниже настройке я получаю массив объектов запросов, но я чувствую, что есть лучший способ сделать это.

Вот это <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, я придумал это.

Вот полный код:

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

Извините за весь код, но я хотел сделать код доступным.Так кто-нибудь видит какие-либо проблемы с тем, что я придумал?

Ответы [ 2 ]

8 голосов
/ 03 апреля 2012

Функция может возвращать только одно значение. Если вы хотите вернуть несколько значений, вам нужно будет использовать некоторый тип сложного объекта (массив, структура, ...). Если массивы недостаточно интуитивны, вы можете разместить запросы в структуре и вернуть их вместо этого. Тогда вызывающая страница может получить доступ к запросам по имени, а не по индексу.

(Примечание: убедитесь, что правильно изменили область действия / локализовали все переменные функции.)

 <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>
3 голосов
/ 03 апреля 2012

Я бы создал другие методы в CFC, каждый из которых отвечал бы за возвращение результата из сохраненного процесса.В основном методе вызывать сеттеры setProfileHead (profilehead: profileHead)

<cffunction name=ProfileHead>
    <cfarguments name=ProfileHead />
    <cfset variables.profilehead = arguments.profilehead>
 </cffunction>

Тогда ...

<cffunction name=GetProfileHead>
    <cfreturn variables.profileHead />
</cffuction>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...