【问题标题】:SQL Query to output to XML输出到 XML 的 SQL 查询
【发布时间】: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;
/

【问题讨论】:

    标签: xml oracle powershell plsql


    【解决方案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>
    

    【讨论】:

    • 谢谢!我现在看到它是如何工作的。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多