从ColdFusion 8获取CLOB数据

从ColdFusion 8获取CLOB数据,coldfusion,coldfusion-8,Coldfusion,Coldfusion 8,我正在尝试从Oracle数据库检索CLOB数据。代码如下: <cfstoredproc datasource="#request.site.datasource#" procedure="GETPAGESWITHMETADATA" result="myResults"> <cfprocparam cfsqltype="CF_SQL_VARCHAR" type="in" value="News"> <cfprocparam cfsqltype="CF_

我正在尝试从Oracle数据库检索CLOB数据。代码如下:

<cfstoredproc datasource="#request.site.datasource#" procedure="GETPAGESWITHMETADATA" result="myResults">
    <cfprocparam cfsqltype="CF_SQL_VARCHAR" type="in" value="News">
    <cfprocparam cfsqltype="CF_SQL_VARCHAR" type="in" value="News Pages">
    <cfprocparam cfsqltype="CF_SQL_CLOB" type="out" variable="XML">
    <cfprocresult name="rs1">
</cfstoredproc>
<cfdump var="#myResults#">
<cfoutput>#XML#</cfoutput>
<cfcatch type="any">
    <cfdump var="#cfcatch#">
</cfcatch>
</cftry>
我检查了服务器上的数据源和启用长文本检索CLOB。选中每个数据源的选项

令人惊讶的是,我没有在屏幕上看到XML结果,而是得到了一个非常短的字符串: [C@74897f5e

它看起来像一个句柄id,而不是内容本身

如何检索XML的完整内容

作为参考,数据源正在使用带有TNS名称的macromedia驱动程序:
驱动程序类:macromedia.jdbc.MacromediaDriver

在CF管理员中检查您的数据源设置。在高级设置下,有一些复选框允许返回BLOB和CLOB数据。如果未选中它们,您可能会在查询中得到截断的数据,正如@MarkAKruger建议的那样,从这个程序解决了这个问题。 以下PL/SQL代码实现了这一点:

create or replace
PACKAGE PCK_Commonspot
AS
type t_clob IS record (metadata CLOB) ;
type t_clob_tab IS TABLE OF t_clob;
FUNCTION GetPagesWithMetadataAsRS(FormName varchar2, CategoryName varchar2)
    RETURN t_clob_tab pipelined;
END PCK_Commonspot;
包体包含以下代码:

FUNCTION GetPagesWithMetadataAsRS(FormName varchar2, CategoryName varchar2)
    RETURN t_clob_tab pipelined
IS
    r t_clob;
 BEGIN
    GETPAGESWITHMETADATA(FormName, CategoryName, r.metadata) ;
    pipe row(r) ;
    RETURN;
END;
函数GETPAGESWITHMETADATA是将CLOB返回到r.metadata的函数 这里的诀窍是返回一个管道表

在ColdFusion方面它变得非常好,因为调用非常简单:

<cfquery name="Test" datasource="myDS" maxrows="1">
    SELECT * FROM TABLE(PCK_Commonspot.GetPagesWithMetadataAsRS('abc','def'))
</cfquery>
<cfset XML = Xmlparse(Test.Metadata)>

谢谢马克!

尽管杰佩托已经回答了他的问题,但我想我会为后代贡献另一个答案

我在从Oracle 11g将CLOB数据返回到CF8时遇到了类似的问题。最初不起作用的解决方案大致如下:

<cfquery name="GetDoc" DATASOURCE=myDS>
SELECT CLOBDATA FROM FILES WHERE FILES.FILEID = #FileID#
</cfquery>

只是检查一下-你希望这个变量在OUT-var-clled-XML中,对吗?试着把它放在一个数据集中吧…我运气不好,OUT-variables没有把它们弄好。我必须调整SP本身的顺序,这样-变量名在SPI中被忽略,不能使用数据集。这的全部目的是在o中返回结构化数据为了避免对数据库的多次调用,xml是一个out参数,调用在sql developer中正常工作我知道这是正确的…并且您不需要多次调用…只需执行类似于创建表blah xml text的操作,然后插入blah xml…从blah中选择xml-以便驱动程序将clob作为数据集返回…一次在CF中,您只需执行parseXMLresultname.xml即可。@MarkAKruger您好。它看起来确实很有趣。您是否有任何存储过程的示例代码来执行此操作?OP说他已启用长文本检索CLOB。
<cfquery name="GetDoc" DATASOURCE=myDS>
SELECT CLOBDATA FROM FILES WHERE FILES.FILEID = #FileID#
</cfquery>
<cfstoredproc PROCEDURE="GETCLOB" DATASOURCE=myDS >
<CFPROCPARAM    TYPE="IN" CFSQLTYPE="CF_SQL_INTEGER" DBVARNAME="pFileID" value="#fileID#"/> 
<CFPROCPARAM    TYPE="OUT" CFSQLTYPE="CF_SQL_LONGVARCHAR" DBVARNAME="pClob" VARIABLE="vClob" /> 
</cfstoredproc>

<!--- Dump the clob to the local filesystem --->
<cfscript>
fstream = CreateObject("java", "java.io.FileOutputStream").init(filepath, JavaCast("boolean","true"));
outStream = CreateObject("java", "java.io.BufferedOutputStream").init(fstream);

outStream.write(#toBinary(vClob)#);
outStream.flush();
outStream.close();
</cfscript>