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

CFAdministratorでデータソースの設定を確認してください。詳細設定の下に、BLOBおよびCLOBデータを返すことを許可するチェックボックスがあります。チェックされていない場合、クエリで切り捨てられたデータが返される可能性があります

于 2012-06-15T16:43:57.883 に答える
0

Jaepettoはすでに彼の質問に答えていますが、私は後世のために別の答えを提供したいと思いました。

Oracle11gからCF8にCLOBデータを返す場合にも同様の問題が発生していました。元の解決策(それは機能していませんでした)は大まかに次のとおりでした:

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

このクエリは正常に完了しますが、GetDoc.CLOBDATA常に空の文字列になります。を使用してCLOBデータを取得すると、常にこれが実行されることが判明しましたが、ストアドプロシージャcfqueryでラップすると、機能しました。これは、私たちが使用しているJDBCドライバーの癖だと思います。

とにかく、私のソリューションのCFの根性は次のとおりでした。CF_SQL_LONGVARCHAR--usingの代わりにを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>
于 2012-09-04T06:10:08.183 に答える