PL/SQL:如何编写 XML 文件?

Posted

技术标签:

【中文标题】PL/SQL:如何编写 XML 文件?【英文标题】:PL/SQL: How to write XML file? 【发布时间】:2020-06-05 13:17:44 【问题描述】:

如何写入 XML 文件? 我使用以下代码,但我不断收到错误。请heeeellllppppp! 这是常见的错误: wrong number or types of arguments in call to 'PUT_LINE' 如果我更改某些内容,则会出现其他错误。

set serveroutput on
DECLARE
    v_filePointer           utl_file.file_type;
    v_filePointer := UTL_FILE.fopen('Myname_DIR', 'Myname' || to_char(sysdate+1,'DD-MON-YYYY') || '.xml', 'w');
    Ctx               DBMS_XMLGEN.ctxHandle;
    xml               CLOB := NULL;
    temp_xml          CLOB := NULL;
    v_query_date      DATE := TRUNC(sysdate+1) ;
    QUERY    VARCHAR2(2000) := 'SELECT tni, sum(volume) tni_total 
                          FROM v_nem_rm16
                          WHERE DAY = '''||v_query_date||''' GROUP BY tni';

BEGIN
    common.log(query);
--    utl_file.put_line(query);
    Ctx := DBMS_XMLGEN.newContext(QUERY);
    DBMS_XMLGen.setRowsetTag( Ctx, 'ROWSETTAG' );
    DBMS_XMLGen.setRowTag( Ctx, 'ROWTAG' );
    temp_xml := DBMS_XMLGEN.getXML(Ctx);

IF temp_xml IS NOT NULL THEN
    IF xml IS NOT NULL THEN
        DBMS_LOB.APPEND( xml, temp_xml );
    ELSE
        xml := temp_xml;
        utl_file.put_line(v_filePointer,'xml.file');
        utl_file.fclose(v_filePointer);
    END IF;
END IF;

    DBMS_XMLGEN.closeContext( Ctx );
    utl_file.put_line(substr(xml, 1, 1950));
end;

【问题讨论】:

【参考方案1】:

您只能在declare 部分进行声明,因此该行在其所在位置无效:

v_filePointer := UTL_FILE.fopen('Myname_DIR', ...

您可以将它移到begin 关键字之后,或者将它与声明结合起来:

    v_filepointer utl_file.file_type :=
        utl_file.fopen('Myname_DIR', 'Myname' || to_char(sysdate + 1, 'DD-MON-YYYY') || '.xml', 'w');

utl_file.put_line 的第一个参数应该是文件 ID,v_filePointer

utl_file.put_line(v_filepointer, substr(xml, 1, 1950));

将日期值直接连接到动态查询中并不是一个好主意,因为您信任默认的日期格式(尽管可以争辩说,无论格式和语言如何,阅读时都是一样的是用于写作的,所以即使你不知道这种格式是什么,它也会起作用。但是,我仍然认为这是一种糟糕的做法。)我更喜欢使用显式格式来构造标准的日期文字。

综合起来,我明白了:

declare
    v_filepointer utl_file.file_type := utl_file.fopen('Myname_DIR', 'Myname' || to_char(sysdate + 1, 'DD-MON-YYYY') || '.xml', 'w');
    ctx           dbms_xmlgen.ctxhandle;
    xml           clob := null;
    temp_xml      clob := null;
    v_query_date  date := trunc(sysdate + 1);
    query         varchar2(2000) := 'select tni, sum(volume) tni_total 
                      from v_nem_rm16
                      where day = date ''' || to_char(v_query_date,'YYYY-MM-DD') || ''' group by tni';
begin
    common.log(query);

    utl_file.put_line(v_filepointer, query);

    ctx := dbms_xmlgen.newcontext(query);
    dbms_xmlgen.setrowsettag(ctx, 'ROWSETTAG');
    dbms_xmlgen.setrowtag(ctx, 'ROWTAG');
    temp_xml := dbms_xmlgen.getxml(ctx);

    if temp_xml is not null then
        if xml is not null then
            dbms_lob.append(xml, temp_xml);
        else
            xml := temp_xml;
            utl_file.put_line(v_filepointer, 'xml.file');
            utl_file.fclose(v_filepointer);
        end if;
    end if;

    dbms_xmlgen.closecontext(ctx);
    utl_file.put_line(v_filepointer, substr(xml, 1, 1950));
    utl_file.fclose_all;
end;

【讨论】:

以上是关于PL/SQL:如何编写 XML 文件?的主要内容,如果未能解决你的问题,请参考以下文章

在 ubuntu 的 Oracle Sql 中,如何打开编辑器来编写 PL/SQL?

如何在 Pl/SQL 中编写正则表达式匹配模式?

如何在 PL/SQL 中编写语句级触发器

如何在 Oracle PL/SQL 中编写此数据库比较?

如何编写 PL 以返回通过服务总线中的 DB 适配器自动生成强类型 XSD 的多行? (甲骨文 PL/SQL)

如何使用 PL/SQL 从 XML 文件中提取数据