无法在ColdFusion中显示sql函数返回的数据

时间:2011-07-14 06:03:21

标签: coldfusion coldfusion-9

我们正在尝试使用ColdFusion中的cffunction在webform中显示记录集。 但我们无法显示ouptut ..我们只是得到一个值(记录集中的最后一个值).sql函数返回ref cursor。请帮助我们解决这个问题! 谢谢!

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

4 个答案:

答案 0 :(得分: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的内容

答案 1 :(得分:2)

一切@Scott Stroz在他的回答中说的是真的 - 1)你在代码和内联函数之间混淆变量名,2)使用var范围来定义函数内的getRKBareDrive变量(不是问题的直接部分)作为内联函数,但良好的做法),3)尝试CFDUMP结果而不是CFOUTPUT它。但是,我不相信核心问题已得到解决,这就是你问题的这一部分:

  

sql函数正在返回ref cursor

所以一个明显的问题是你返回一个REFCURSOR而不是一个简单的值,所以你不能只是CFOUTPUT它,而是需要采取某些步骤,所以ColdFusion知道它是一个查询集。 REFCURSOR可以通过CFPROCRESULT从存储过程调用返回(或者通过CFPROCPARAM类型=“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 query =“bare_drive_result”调用中的普通CFQUERY结果一样。

来自CF8 documentation on CFPROCRESULT

  

CFML支持Oracle 8和9 Reference Cursor类型,它传递了一个   参考参考。以这种方式传递的参数可以是   在执行一个内存时从内存中分配和释放   应用。在包中使用引用游标或存储   程序,使用cfprocresult标记。这导致ColdFusion JDBC   用于将Oracle引用游标放入结果集的数据库驱动程序。   (您不能将此方法与Oracle的ThinClient JDBC驱动程序一起使用。)

答案 2 :(得分:0)

试试这个

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

答案 3 :(得分:0)

我怀疑Scott的解决方案可以帮助您解决问题,但如果您仍然遇到问题,可以在查询中添加结果参数以帮助排查问题。看看究竟是什么传递。

<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