输出到 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 查询的主要内容,如果未能解决你的问题,请参考以下文章