2011-07-14 18 views
0

ColdFusionでcffunctionを使用してWebフォームにレコードセットを表示しようとしています。 しかし、私たちはouptutを表示することはできません。私たちはちょうど単一の値(レコードセットの最後の値)を取得しています.Sql関数は参照カーソルを返しています。感謝! ありがとう!ColdFusionでsql関数から返されたデータを表示できません

<cfset bare_drive_result = functionname('x','y')> 

<cffunction name="functionname" hint="Gets all customer from the database" returntype="query"> 
    <cfargument name="sPcwQua" type=any> 
    <cfargument name="sPcwAcc" type=any> 

    <cfquery name="getRkBareDrive" datasource= "#PCW_dsn#"> 
     select pacakagename.functionname('#sPcwQua#','#sPcwAcc#') bare_drive_result 
     from dual 
    </cfquery> 

    <cfreturn getRkBareDrive> 
</cffunction> 

<cfoutput>#getRkBareDrive.bare_drive_result#</cfoutput> 
+0

データベースで実行すると複数のレコードが返されますか?プロシージャを使用しようとしましたか/ cfstoredproc http://kb2.adobe.com/cps/176/tn_17633.html * http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_r -s_22.html – Leigh

答えて

0

あなたはスコープの問題を持っているこの

<cfoutput query="getRkBareDrive">#getRkBareDrive.bare_drive_result#</cfoutput> 
+0

私たちはこれを試しました。働いていません。 – beena

4

を試してみてください。メソッド内のクエリの名前はgetRKBareDriveですが、その関数呼び出しの結果を別の変数名-bare_drive_resultに設定しています。

コードが実際に次のようになります。

<cfoutput query="bare_drive_result">#bare_drive_result.bare_drive_result</cfoutput> 

そして、あなたの関数の中で、あなただけのcfargumentタグの後に次の行を追加する必要があります。

<cfset var getRkBareDrive = "" /> 

しかし、あなたの当面の問題を解決しないこと。それでも問題が解決しない場合はあなたがあなたのクエリに結果パラメータを追加することができますが、私は、スコットのソリューションは、あなたを助けます疑う

<cfdump var="#bare_drive_result#" /> 

を実際のColdFusion

+0

はい、スコットが言ったように、私はそれがここでのすべての問題であるかどうかはわかりません。 CFFUNCTIONを先頭またはCFCに分離して、おそらくそれをより明確にするようにしてください。ただし、関数呼び出しの結果はgetRKBareDriveではなくbare_drive_resultというvarに格納されます(これは関数自体で使用されるvar名です)。 – mujimu

0

に返されるかを見るために:あなたがやってみました&が何を通過しているかを正確に確認してください。

<cfquery name="getRkBareDrive" datasource= "#PCW_dsn#" result="qryname"> 

そのダンプ:

<cfdump var="#qryname#" /> 

返される構造は、[私はそれが実際に一つだけを返している疑いがある]、あなたの結果などの数を渡されたクエリを表示する必要があり、ここでは詳しい説明を参照してください。 http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_p-q_17.html

+0

実際のクエリオブジェクトをダンプするには、実行されたSQL、渡されたパラメータなどの情報も含める必要があります。これは、ColdFusionの新しいバージョンを前提としています。 –

2

@Scott Strozが答えたことはすべて、1)コードとインライン関数の間で変数名が混乱している、2)varスコープを使用して関数内にgetRKBareDrive変数を定義する問題はインライン関数ではあるが良い習慣)、3)CFOUTPUTの代わりにCFDUMPを実行してください。しかし、私はあなたの質問のこの部分に位置しており、コアの問題が解決されるとは思わない:

SQL関数が

参照カーソルを返しているので、1つの明白な問題は、あなたが戻ってきているということですREFCURSORは単純な値ではないので、単にCFOUTPUTするだけでなく、ColdFusionがそれがクエリセットであることがわかるように特定の手順を実行する必要があります。 REFCURSORは、CFPROCRESULT(またはCFPROCPARAM type = "OUT" CFSQLType = "CF_SQL_REFCURSOR"を介して返されたパラメータであれば結果ではなく)を介してストアドプロシージャからの呼び出しで返すことができます。

だから... CFQUERYコールをCFSTOREDPROCに適用してみてください。ここでは、というクエリを通じて、ストアドプロシージャとしてパッケージ/関数を直接呼び出すことができると仮定したサンプルコードがあります。私はインライン関数を削除しました。ここではあまりにも複雑です(Scottの答えも参照してください)。コールを動作させる方法として裸のコードを試してみてください。

<cfstoredproc procedure="pacakagename.functionname" datasource= "#PCW_dsn#"> 
    <cfprocparam type="IN" CFSQLType="CF_SQL_VARCHAR", value="x">  
    <cfprocparam type="IN" CFSQLType="CF_SQL_VARCHAR", value="y">  
    <cfprocresult name="bare_drive_result" > 
</cfstoredproc> 
<cfdump var="#bare_drive_result#"> 

あなたがダンプに結果が表示されている場合、あなただけのCFOUTPUTクエリ=「bare_drive_result」コール内の通常CFQUERY結果のようにダンプと出力参照カーソル内のフィールドを置き換えることができるはずです。 CF8 documentation on CFPROCRESULTから

CFMLは、参照することにより パラメータを渡しオラクル8と9リファレンスカーソルの種類をサポートしています。この方法で渡されるパラメータは、 アプリケーションの実行中に に割り当てられ、メモリから割り当てが解除されます。パッケージ内の参照カーソルを使用するか、または手順 を保存するには、cfprocresultタグを使用します。これにより、ColdFusion JDBC データベースドライバは、Oracle参照カーソルを結果セットに配置します。 (このメソッドをOracleのThinClient JDBCドライバで使用することはできません)

+0

+1。良い説明。 – Leigh

関連する問題