ventajas tutorial que español ejemplos desventajas descargar coldfusion coldfusion-8

tutorial - Obtención de datos CLOB de ColdFusion 8



coldfusion tutorial español (3)

Estoy tratando de recuperar datos CLOB de nuestra base de datos Oracle. el código es el siguiente:

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

Básicamente, la salida del procedimiento almacenado es:

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

Revisé las fuentes de datos en el servidor y "Habilitar la recuperación de texto largo (CLOB)". la opción está marcada para cada fuente de datos.

Sorprendentemente, en lugar de obtener el resultado XML en la pantalla, obtengo una cadena muy corta: [C @ 74897f5e

Parece una identificación de identificador en lugar del contenido en sí.

¿Cómo puedo recuperar el contenido completo del XML?

Como referencia, la fuente de datos está utilizando controladores de Macromedia con nombre TNS: Clase de controlador: macromedia.jdbc.MacromediaDriver


Verifique la configuración de su fuente de datos en el administrador de CF. En la configuración avanzada, hay casillas de verificación para permitir que se devuelvan los datos BLOB y CLOB. Si no están marcados, podría obtener datos truncados en sus consultas


Como @MarkAKruger sugirió, devolver una tabla del procedimiento resolvió el problema. El siguiente código PL / SQL hizo el truco:

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;

El cuerpo del paquete contiene el siguiente código:

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;

La función GETPAGESWITHMETADATA es la que devuelve un CLOB en r.metadata Aquí, el truco está alrededor de devolver una tabla canalizada.

Se vuelve súper agradable en el lado de ColdFusion porque la llamada es realmente simple:

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

Gracias Mark!


Aunque Jaepetto ya respondió su pregunta, pensé en aportar otra respuesta para la posteridad.

Estaba teniendo problemas similares para devolver los datos de CLOB a CF8 desde Oracle 11g. La solución original (que no funcionaba) era aproximadamente:

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

Esta consulta se completará correctamente, pero GetDoc.CLOBDATA siempre será una cadena vacía. Resultó que la recuperación de datos CLOB usando cfquery siempre haría esto, pero si lo envolví en un proceso almacenado, entonces funcionó. Supongo que esta es una peculiaridad de los controladores JDBC que estamos usando.

De todos modos, las agallas CF de mi solución fueron las siguientes. Tenga en cuenta el uso de CF_SQL_LONGVARCHAR lugar de CF_SQL_CLOB , el uso de CF_SQL_CLOB me dio el extraño valor de identificador de identificador que Jaepetto estaba viendo.

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