2012-06-15 2 views
3

Oracle 데이터베이스에서 CLOB 데이터를 검색하려고합니다.ColdFusion 8에서 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)를 사용"

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

내가 서버에 데이터 소스를 확인하고, 옵션이 모든 데이터 소스에 대해 점검됩니다.

놀랍게도, 대신 화면에 XML 결과를 받고, 나는 매우 짧은 문자열을 얻을 : [C 그것은 핸들 대신 ID 콘텐츠 자체처럼 보이는

74897f5e @.

XML의 전체 내용을 검색하려면 어떻게해야합니까? 참고로

는, 데이터 소스는 TNS 이름으로 매크로 미디어 드라이버를 사용하고 있습니다 : 드라이버 클래스 : macromedia.jdbc.MacromediaDriver

+1

"OUT"var의 "XML"오른쪽에있는이 var가 예상됩니까? 대신 데이터 세트에 넣으십시오 ... 나는 변수를 올바르게 사용하는 것이 끔찍한 행운을 빕니다. 주문과 관련하여 SP 자체를 조정해야합니다. SP 내에서 변수 이름이 무시됩니다. –

+0

데이터 집합을 사용할 수 없습니다. 이 목적의 전체 목적은 구조화 된 데이터를 반환하여 데이터베이스에 대한 다중 호출을 피하는 것입니다. – Jaepetto

+0

xml은 out 매개 변수이며 호출은 SQL 개발자 – Jaepetto

답변

1

@MarkAKruger가 제안했듯이 절차에서 표를 반환하면 문제가 해결됩니다.

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; 

패키지 본문은 다음 코드를 포함 : 다음 PL/SQL 코드는 속임수를 썼는지

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입니다 여기서 r.metadata 에 CLOB를 반환 한 트릭은 파이프 테이블을 반환하는 것입니다. 전화가 정말 간단하기 때문에

그것은는 ColdFusion 측에서 슈퍼 좋은됩니다 :

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

감사합니다 마크!

0

를 CF 관리자에서 데이터 소스 설정을 확인합니다. 고급 설정에는 BLOB 및 CLOB 데이터를 리턴 할 수있는 선택란이 있습니다. 선택을 취소하면 검색어에 잘린 데이터가 반환 될 수 있습니다.

+0

OP는 "긴 텍스트 검색 (CLOB) 사용"을 설정했다고 말합니다. – ale

0

비록 자펫 토가 이미 그의 질문에 대답했지만, 나는 후손을 위해 또 다른 대답을 제시 할 것이라고 생각했다.

CLOB 데이터를 Oracle 11g에서 CF8로 반환하는 것과 비슷한 문제가있었습니다. 원래 솔루션 (즉, 작동하지 않는) 약 :이 쿼리가 성공적으로 완료,하지만 GetDoc.CLOBDATA 항상 빈 문자열이 될 것이다

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

. cfquery을 사용하여 CLOB 데이터를 검색하면 항상이 작업을 수행 할 수 있지만 저장 프로 시저에서이 데이터를 래핑하면 작동합니다. 나는 이것이 우리가 사용하고있는 JDBC 드라이버의 몇 가지 단점이라고 가정한다.

어쨌든, 내 솔루션의 CF 내장은 다음과 같습니다. CF_SQL_CLOB 대신 CF_SQL_LONGVARCHAR을 사용하십시오. 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>