2011-01-13 4 views
0

私はストアドプロシージャを実行し、結果を返す検索関数を持っています。結果がない場合は、より一般化された検索でもう一度関数を実行してみたいと思います。何の結果がなかった場合は、基本的に再帰的メソッド呼び出しで何が問題になっていますか?

<cfif results.recordCount EQ 0 And Not arguments.searchForPotentialMatches> 
    <cfset arguments.searchForPotentialMatches = True /> 
    <cfinvoke method="thisMethod" argumentCollection="#arguments#" /> 
</cfif> 

、私はすでにそれが再び、このメソッドを呼び出す必要があり、一般的な検索を試していない - だから、私は自分のコードにCFIFを置きます。次に、メソッドの始めに、ストアドプロシージャを呼び出す前に、searchForPotentialMatchesがtrueであるかどうかをチェックし、そうであれば検索クエリを一般化します。

問題があるようです...実行しようとすると、ストアドプロシージャでタイムアウトが発生するまでハングアップします。変数をデバッグして出力することで、ストアドプロシージャに到達したことを確認してから、実行しようとしました。しかし、これらの再実行の前に元の関数を使用して、通常の検索を行い、次に2つの別々の呼び出しで一般化された検索を実行すると、正しく実行されます。だから私はプログラムでこれを構築しようとすると失敗する理由は分かりません...どうしたのですか?

+1

関数呼び出し全体を投稿してください。この問題は、再帰呼び出しそのものにある場合とそうでない場合があります。 –

答えて

0

これは不公平だと感じています...しかし、問題はまったく異なるものでした。再帰呼び出しは正しく機能しますが、ストアドプロシージャを呼び出してストアドプロシージャをハングさせる前に、関数のチェックによって変更された別のフィールドがありました。申し訳ありません、あなたの助けをありがとう!

2

実際にはいくつでもかまいません。このコードはすべてcfcの中にありますか?そのcfcは永続的なスコープにあり、あなたはすべての変数を正しくvar'dしていますか?

通常の条件と一般化された条件の両方でストアドプロシージャを問題なく実行できますか?

データフローをもう少しトレースするように、多くのコード(ストアドプロシージャの最初の呼び出しを含む)に貼り付けてください。

1

再帰は次のとおりです。

  • 理論と実践ではお尻の痛みで魅力的で、単純な - デバッグします。
  • 多くの場合、木を歩いたり、グラフを横断したりする必要があります。

あなたが書いたように、私は再帰を失い、それを順番に行います。不在のいずれかのより多くのコード@scrittlerが要求されるように、私のような書き換えたい:

<cfcomponent output="false"> 
    <cffunction name="search" output="false" access="public" returntype="any" hint="I am called by the client"> 
     <!--- <cfargument/> tags ---> 
     <!--- what ever you need to do with the arg before actually searching ---> 
     <cfset var results = doSearch(argumentCollection=arguments)> 
     <cfif NOT results.recordcount> 
      <!--- whatever you need to change about the args to perform a generalized search ---> 
      <cfset var results = doSearch(argumentCollection=arguments)> 
     </cfif> 

     <cfreturn results> 
    </cffunction> 

    <cffunction name="doSearch" output="false" access="private" returntype="query" hint="I run the query"> 
     <!--- <cfargument/> tags ---> 
     <!--- results query (i.e. call to sproc)---> 
     <cfreturn results> 
    </cffunction> 
</cfcomponent> 
0

機能タグのあなたのアクセス属性がどのようなものです、あなたはそれを自分自身を呼び出すことができない機能を残し値を与えていますか?

関連する問題