输出到 XML 的 SQL 查询

Posted

技术标签:

【中文标题】输出到 XML 的 SQL 查询【英文标题】:SQL Query to output to XML 【发布时间】:2018-05-11 23:56:59 【问题描述】:

作为试图将这些数据拉入 Powershell 的大型项目的一部分,我使用 PL/SQL 脚本从 Oracle 提取撤消值 - 当前和推荐值,然后输出到 XML 文件,然后我可以使用 Powershell 解析该文件.我最终还希望推荐的 undo 参数返回运行查询的时间戳,以比较它在一段时间内的变化。

不过,此时我只是在尝试输出如下:

<currundo>903</currundo>
<recundo>14400</recundo>

当我运行这个 pl/sql 时,我得到:

ERROR at line 5:
ORA-06550: line 5, column 5:
PLS-00428: an INTO clause is expected in this SELECT statement

代码如下:

set heading off

DECLARE
    l_xmltype XMLTYPE;

BEGIN
select dbms_xmlgen.getxml('SELECT SUBSTR(e.value,1,25) "curundo", ROUND(d.undo_size / (to_number(f.value) * g.undo_block_per_sec)) "recundo"
  FROM (
       SELECT SUM(a.bytes) undo_size
          FROM v$datafile a,
               v$tablespace b,
               dba_tablespaces c
         WHERE c.contents = ''UNDO''
           AND c.status = ''ONLINE''
           AND b.name = c.tablespace_name
           AND a.ts# = b.ts#
       ) into d,
       v$parameter e,
       v$parameter f,
       (
       SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
              undo_block_per_sec
         FROM v$undostat
       ) into g
WHERE e.name = ''undo_retention''
  AND f.name = ''db_block_size''') from dual;

END;
/

【问题讨论】:

【参考方案1】:

我修复了你的“into”引用和数据类型来产生这个

SQL> DECLARE
  2      l_xmltype clob;
  3
  4  BEGIN
  5  select dbms_xmlgen.getxml('SELECT SUBSTR(e.value,1,25) "curundo",
  6        ROUND(d.undo_size / (to_number(f.value) * g.undo_block_per_sec)) "recundo"
  7    FROM (
  8         SELECT SUM(a.bytes) undo_size
  9            FROM v$datafile a,
 10                 v$tablespace b,
 11                 dba_tablespaces c
 12           WHERE c.contents = ''UNDO''
 13             AND c.status = ''ONLINE''
 14             AND b.name = c.tablespace_name
 15             AND a.ts# = b.ts#
 16         )  d,
 17         v$parameter e,
 18         v$parameter f,
 19         (
 20         SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
 21                undo_block_per_sec
 22           FROM v$undostat
 23         )  g
 24  WHERE e.name = ''undo_retention''
 25    AND f.name = ''db_block_size''')
 26    into l_xmltype from dual;
 27
 28  END;
 29  /

PL/SQL procedure successfully completed.

当然那只是把输出放到一个变量中。如果你想在屏幕上显示,你可以在没有 PLSQL 的情况下进行选择,例如

SQL> spool myfile.out
SQL> select dbms_xmlgen.getxml('SELECT SUBSTR(e.value,1,25) "curundo",
  2    ROUND(d.undo_size / (to_number(f.value) * g.undo_block_per_sec)) "recundo"
  3    FROM (
  4         SELECT SUM(a.bytes) undo_size
  5            FROM v$datafile a,
  6                 v$tablespace b,
  7                 dba_tablespaces c
  8           WHERE c.contents = ''UNDO''
  9             AND c.status = ''ONLINE''
 10             AND b.name = c.tablespace_name
 11             AND a.ts# = b.ts#
 12         )  d,
 13         v$parameter e,
 14         v$parameter f,
 15         (
 16         SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
 17                undo_block_per_sec
 18           FROM v$undostat
 19         )  g
 20  WHERE e.name = ''undo_retention''
 21    AND f.name = ''db_block_size''')
 22    from dual;

DBMS_XMLGEN.GETXML('SELECTSUBSTR(E.VALUE,1,25)"CURUNDO",ROUND(D.UNDO_SIZE/(TO_NU
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <curundo>900</curundo>
  <recundo>41668</recundo>
 </ROW>
</ROWSET>

【讨论】:

谢谢!我现在看到它是如何工作的。感谢您的帮助!

以上是关于输出到 XML 的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 xsd 模式和 sql 查询的输出生成 xml

如何修改此 SQL 查询中的 XML 代码以突出显示表的特定行?

如何把SQL语句的查询结果保存到文件中?

SQL 查询到带有标签属性的 XML

XML 文档到 SQL Server 查询

如何读取 FOR XML SQL Server 查询的完整结果?