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?