简体   繁体   English

用于从Oracle数据库表生成XML文件

[英]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... 即使没有太大帮助,我也会保留原始答案...

here is your code in general (i replaced <> with "): 这是您的一般代码(我将<>替换为“”):

.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”写入文件

I see few steps missing: 我发现缺少几个步骤:

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM