我正在尝试从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驱动程序: 驱动程序类:macromedia.jdbc.MacromediaDriver
答案 0 :(得分: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)>
谢谢Mark!
答案 1 :(得分:0)
检查CF管理员中的数据源设置。在高级设置下,有复选框以允许返回BLOB和CLOB数据。如果未选中它们,您可能会在查询中返回截断的数据
答案 2 :(得分:0)
尽管Jaepetto已经回答了他的问题,但我认为我会为后代提供另一个答案。
我遇到类似的问题,从Oracle 11g将CLOB数据返回到CF8。最初的解决方案(不起作用)大致是:
<cfquery name="GetDoc" DATASOURCE=myDS>
SELECT CLOBDATA FROM FILES WHERE FILES.FILEID = #FileID#
</cfquery>
此查询将成功完成,但GetDoc.CLOBDATA
将始终为空字符串。事实证明,使用cfquery
检索CLOB数据总是这样做,但是如果我将它包装在存储过程中,那么它就可以了。我假设这是我们正在使用的JDBC驱动程序的一些怪癖。
无论如何,我的解决方案的CF内容如下。请注意使用CF_SQL_LONGVARCHAR
代替CF_SQL_CLOB
- 使用CF_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>