【问题标题】:Getting CLOB data from ColdFusion 8从 ColdFusion 8 获取 CLOB 数据
【发布时间】:2012-06-15 15:17:23
【问题描述】:

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

【问题讨论】:

  • 只是检查 - 您应该在 "OUT" var 中将这个 var 写成 "XML" 对吗?试着把它放在一个数据集中......我运气不好,没有变量让它们正确。我必须调整 SP 本身的顺序等 - 变量名称在 SP 内被忽略
  • 我无法使用数据集。这样做的全部目的是返回结构化数据,以避免多次调用数据库。
  • xml是out参数,在sql developer中调用正常
  • 我知道这是正确的...而且您不需要多次调用...只需执行一些操作,例如创建表 #blah (xml text) 然后插入 #blah (xml) 。 .. 从#blah 中选择 xml - 以便驱动程序将您的 clob 作为数据集返回...一旦在 CF 中,您可以简单地执行 parseXML(resultname.xml)。
  • @MarkAKruger 你好。它绝对看起来很有趣。你有存储过程的示例代码吗?

标签: coldfusion coldfusion-8


【解决方案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)>

谢谢马克!

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • OP 说他开启了“启用长文本检索 (CLOB)”。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 2022-07-21
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      相关资源
      最近更新 更多