generar archivo .xml desde PL/SQL

occiso
05 de Enero del 2005
holas, estoy intentando generar un archivo xml desde pl/sql. De momento lo unico que he hecho es un procedimiento, el el siguiente:

create or replace procedure xml is
result CLOB;
BEGIN
result := dbms_xmlquery.GETXML(
'SELECT * from alumnos'
);
END xml;

Me gustaria saber como poder generar el archivo con el codigo xml. ¿no hay alguna de manera de configurar un PATH para que se te guarden alli todos los archivos generados?

estoy un poco perdido, y la verdad es que me urge

gracias por adelantado.

ramon
05 de Enero del 2005
Mira ocupa algo asi.

CREATE OR REPLACE PROCEDURE printClobOut(result IN OUT NOCOPY CLOB) is
xmlstr varchar2(32767);
line varchar2(2000);
begin
xmlstr := dbms_lob.SUBSTR(result,32767);
loop
exit when xmlstr is null;
line := substr(xmlstr,1,instr(xmlstr,chr(10))-1);
dbms_output.put_line('| '||line);
xmlstr := substr(xmlstr,instr(xmlstr,chr(10))+1);
end loop;
end;
/


Primero te creas el procedimiento printClobOut, el que va a mostrar (en este caso por pantalla) el contenido de una variable clob,
Luego ejecutas las siguientes lineas y te debiera mostrar el XML generado. Despues, algo similar debieras tener para convertir eso en un archivo.

declare
queryCtx DBMS_XMLquery.ctxType;
result CLOB;
begin

-- set up the query context...!
queryCtx := DBMS_XMLQuery.newContext('select * from emp');

-- get the result..!
result := DBMS_XMLQuery.getXML(queryCtx);
-- Now you can use the result to put it in tables/send as messages..
printClobOut(result);
DBMS_XMLQuery.closeContext(queryCtx); -- you must close the query handle..
end;
/


Salu2

Ramon Calderon Rojas

occiso
05 de Enero del 2005
He encontrado esto:

DECLARE
v_file Utl_File.File_Type;
v_xml CLOB;
v_more BOOLEAN := TRUE;
BEGIN
-- Create XML document from query.
v_xml := DBMS_XMLQuery.GetXML('SELECT * from alumnos');

-- Output XML document to file.
v_file := Utl_File.FOpen('D:archivosXML', 'test1.xml', 'w');
WHILE v_more LOOP
Utl_File.Put(v_file, Substr(v_xml, 1, 32767));
IF Length(v_xml) > 32767 THEN
v_xml := Substr(v_xml, 32768);
ELSE
v_more := FALSE;
END IF;
END LOOP;
Utl_File.FClose(v_file);

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(Substr(SQLERRM,1,255));
Utl_File.FClose(v_file);
END;


pero tampoco me escribe nada en el archivo test1.xml, lo deja en blanco.

¿por qué?