[英]for Generate XML file from Oracle Database Tables
I have a Query I want t Create a store procedure for generate a xml file with respect table, Store procedure input parameter is table name , when User execute this store procedure then one xml file has created in select dir , I have created one store procedure but i am not getting proper xml format, please help 我有一个查询,我想创建一个存储过程以使用尊重表生成xml文件,存储过程输入参数为表名,当用户执行此存储过程时,则在select dir中创建了一个xml文件,我创建了一个存储过程但我没有得到正确的xml格式,请帮助
<? xml version= 1.0 encoding= utf-8 standalone= yes?>
<root xmlns xs="http //www.w3.org/2001/xmlschema">
<tablename>
<column name1>column data</column name1>
<column name2>column data</column name2>
<column name3>column data</column name3>
<column name4>column data</column name4>
<column name1>column data</column name1>
<column name2>column data</column name2>
<column name3>column data</column name3>
<column name4>column data</column name4>
<column name1>column data</column name1>
<column name2>column data</column name2>
<column name3>column data</column name3>
<column name4>column data</column name4>
<column name1>column data</column name1>
<column name2>column data</column name2>
<column name3>column data</column name3>
<column name4>column data</column name4>
....
....
</tablename>
create or replace
PROCEDURE Export_In_XML1
(
V_TABLE_NAME1 IN varchar2,
v_FLAG OUT NUMBER
)
AS
BEGIN
----- Export table data
DECLARE
v_file UTL_FILE.file_type;
qryCtx DBMS_XMLGEN.ctxHandle;
result CLOB;
v_FILENAME varchar(50);
xt_data xmltype;
v_ctx dbms_xmlgen.ctxHandle;
rc_data sys_refcursor;
V_TABLE_NAME varchar(50);
BEGIN
---------for Project table
V_TABLE_NAME :=UPPER(V_TABLE_NAME1);
IF UPPER(V_TABLE_NAME) = 'LEG_DISTRICTS' THEN
BEGIN
v_file := UTL_FILE.fopen('MYXML',V_TABLE_NAME ||'.xml', 'W');
OPEN rc_data FOR
'SELECT COUNTYID as COUNTYID,
ASSEMBLY,
SENATE,
CONG,
TXT_ASS,
TXT_SEN,
TXT_CON
from '||V_TABLE_NAME ||'';
v_ctx := dbms_xmlgen.newContext (rc_data);
DBMS_XMLGEN.setrowsettag(v_ctx, 'LEG_DISTRICTS');
DBMS_XMLGEN.setrowtag(v_ctx, NULL);
xt_data := dbms_xmlgen.getXMLType(v_ctx);
dbms_xmlgen.closeContext (v_ctx);
v_file := UTL_FILE.fopen('MYXML', V_TABLE_NAME ||'.xml', 'A');
dbms_xslprocessor.clob2file( xt_data.getclobval( ), 'MYXML', ''||V_TABLE_NAME||'.xml',1);
v_FLAG := 1;
UTL_FILE.FCLOSE(v_file);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
dbms_xmlgen.closeContext (v_ctx);
UTL_FILE.FCLOSE(v_file);
v_FLAG := 0;
end ;
ELSIF UPPER(V_TABLE_NAME) = 'EMAIL' THEN
BEGIN
v_file := UTL_FILE.fopen('MYXML',V_TABLE_NAME ||'.xml', 'W');
OPEN rc_data FOR
' SELECT SUBJECT as SUBJECT,
TRIM(MESSAGE) AS MESSAGE,
TRIM(SENDTO) AS SENDTO,
TRIM(SENT) AS SENT,
SENT_TIME,
ID from '||V_TABLE_NAME ||' ';
v_ctx := dbms_xmlgen.newContext (rc_data);
DBMS_XMLGEN.SETNULLHANDLING(v_ctx,0);
DBMS_XMLGEN.setrowsettag(v_ctx, 'EMAIL');
DBMS_XMLGEN.setrowtag(v_ctx, NULL);
xt_data := dbms_xmlgen.getXMLType( nvl(v_ctx,''));
dbms_xmlgen.closeContext (v_ctx);
v_file := UTL_FILE.fopen('MYXML', V_TABLE_NAME || '.xml', 'A');
dbms_xslprocessor.clob2file( xt_data.getclobval( ), 'MYXML', ''||V_TABLE_NAME||'.xml',1);
v_FLAG := 1;
UTL_FILE.FCLOSE(v_file);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
dbms_xmlgen.closeContext (v_ctx);
UTL_FILE.FCLOSE(v_file);
v_FLAG := 0;
END ;
-----for all other tables
ELSE
BEGIN
qryCtx := dbms_xmlgen.newContext ('SELECT * from '||V_TABLE_NAME ||'');
v_FILENAME :=V_TABLE_NAME;
DBMS_XMLGEN.setMaxRows(qryCtx, 5);
v_file := UTL_FILE.fopen('MYXML',v_FILENAME ||'.xml', 'W');
UTL_FILE.put_line(v_file, '<'||v_FILENAME||'>');
-- v_file := UTL_FILE.FOPEN('MYXML', v_FILENAME|| '.xml', 'R');
LOOP
DBMS_XMLGEN.SETNULLHANDLING(qryCtx ,null);
DBMS_XMLGEN.setRowSetTag(qryCtx, 0);
DBMS_XMLGEN.setRowTag(qryCtx, '');
-- save the XML into the CLOB field
result := DBMS_XMLGEN.getXML(qryCtx);
result := REPLACE( result, '<?xml version="1.0"?>',' ');
result := REPLACE( result, '<_x0030_>',' ');
result := REPLACE( result, '</_x0030_>',' ');
-- UTL_FILE.put_line(v_file, '');
EXIT WHEN DBMS_XMLGEN.getNumRowsProcessed(qryCtx) = 0;
-- store the XML to a XML files
UTL_FILE.put_line(v_file, result);
END LOOP;
UTL_FILE.put_line(v_file,'</'||v_FILENAME||'>');
UTL_FILE.FCLOSE(v_file);
END;
END IF;
END;
END Export_In_XML1;
for above store procedure gives result 以上存储过程给出结果
<AGNCY>
<AGENCYID>01</AGENCYID>
<NAME>ABC</NAME>
<MARKDELETED>02</MARKDELETED>
<AGENCYID>02</AGENCYID>
<NAME>Area</NAME>
<MARKDELETED>0</MARKDELETED>
<AGENCYID>03</AGENCYID>
<NAME>CTSA</NAME>
<MARKDELETED>0</MARKDELETED>
<AGENCYID>004</AGENCYID>
<NAME>Glal</NAME>
<MARKDELETED>0</MARKDELETED>
-----
-----
-----
</AGNCY>
and I required below output 我需要下面的输出
requried output---------- 要求的输出----------
<? xml version= 1.0 encoding= utf-8 standalone= yes?>
<root xmlns xs="http //www.w3.org/2001/xmlschema">
<AGNCY>
<AGENCYID>01</AGENCYID>
<NAME>ABC</NAME>
<MARKDELETED>02</MARKDELETED>
<AGENCYID>02</AGENCYID>
<NAME>Area</NAME>
<MARKDELETED>0</MARKDELETED>
-----
-----
-----
</AGNCY>
if, I use UTL_FILE.put_line befor generateing XML , then i loss some table data.. 如果我在生成XML之前使用UTL_FILE.put_line,那么我会丢失一些表数据。
you could modifiy this line to replace default declaration with first 2 lines of "required output" 您可以修改此行以将默认声明替换为“必需输出”的前两行
result := REPLACE( result, '<?xml version="1.0"?>',' ');
then add closing tag 然后添加结束标签
DBMS_LOB.append(result, TO_CLOB('</root>'));
Looks like your problem is not with XML and DBMS_XMLGET, but with how to work with CLOBS. 看来您的问题不在于XML和DBMS_XMLGET,而在于如何使用CLOBS。 So, here is a link for you: http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm 因此,这是您的链接: http : //docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm
Or maybe the problem was that your desired output is also not well-formed xml? 也许问题在于您所需的输出也不是格式正确的xml? you do not have closing root tag. 您没有关闭的根标签。
I will keep original answer, even if was not that helpful... 即使没有太大帮助,我也会保留原始答案...
.10 write "tablename" in a file .10在文件中写入“表名”
.20 List item .20列表项
.30 write rows of table in a clob .30将表中的行写在Clob中
.40 write clob to file .40将clob写入文件
.50 write "/tablename" to file .50将“ / tablename”写入文件
.05 write "?xml... to file .05写入“?xml ...”文件
.06 write "root... to file .06将“ root ...”写入文件
.55 write "/root" to file .55将“ / root”写入文件
Have you tried using XMLSERIALIZE to generate a CLOB with correct declaration and then 您是否尝试过使用XMLSERIALIZE生成具有正确声明的CLOB,然后
SQL> desc DBMS_XSLPROCESSOR
PROCEDURE CLOB2FILE
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
CL CLOB IN
FLOCATION VARCHAR2 IN
FNAME VARCHAR2 IN
CSID NUMBER IN DEFAULT
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.