3

我正在尝试从我们的 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>

基本上,存储过程的输出是:

select dbms_xmlquery.getxml(queryCtx) INTO XML from dual;

我检查了服务器上的数据源和“启用长文本检索 (CLOB)”。为每个数据源检查选项。

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

它看起来像句柄 id 而不是内容本身。

如何检索 XML 的完整内容?

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

4

3 回答 3

1

正如@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)>

谢谢马克!

于 2012-06-20T14:50:57.520 回答
0

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

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

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

此查询将成功完成,但GetDoc.CLOBDATA始终为空字符串。事实证明,使用检索 CLOB 数据cfquery总是会这样做,但如果我将它包装在一个存储的过程中,那么它就可以了。我认为这是我们正在使用的 JDBC 驱动程序的一些怪癖。

无论如何,我的解决方案的 CF 胆量如下。注意使用CF_SQL_LONGVARCHAR而不是CF_SQL_CLOB- usingCF_SQL_CLOB给了我 Jaepetto 看到的奇怪的句柄 ID 值。

<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>
于 2012-09-04T06:10:08.183 回答
0

在 CF Administrator 中检查您的数据源设置。在高级设置下,有允许返回 BLOB 和 CLOB 数据的复选框。如果未选中它们,您可能会在查询中返回截断的数据

于 2012-06-15T16:43:57.883 回答