首页 > 解决方案 > 在 Oracle 中使用 XML 数据创建 SQL 视图

问题描述

我正在尝试为此输出创建视图,但收到错误 ORA-04044:此处不允许过程、函数、包或类型。更改括号将导致无效的 SQL 语句或缺少括号错误。

代码如下:

CREATE VIEW DQ AS
(SELECT
a.USERNAME AS USER,
a.ITEM AS ITEM,
a.BUSINESS AS BUSINESS,
a.ADDED AS ADDED,
(SELECT x.* FROM XMLTABLE('$Logs/Actions/Info' PASSING Logs AS "Logs"
COLUMNS
ITEM VARCHAR(30) PATH '@ITEM',
REGION VARCHAR(100) PATH '@REGION',
ADDED_NEW VARCHAR(60) PATH '@ADDED_NEW'))AS x)
FROM IDS b, IT_LOGS a, x
WHERE a.BUSINESS IN ('x', 'y', 'z')
AND x.ITEM=b.IDS(+)
AND a.ADDED BETWEEN TO_DATE ('1/1/2019 00:00:01', 'MM/DD/YYYY HH24:MI:SS') AND TO_DATE('2/1/2019 23:59:59,'MM/DD/YYYY HH24:MI:SS')
);

我错过了什么?谢谢。

标签: sqloracleviewxmltable

解决方案


USER首先,如果可以避免的话,不要使用 Oracle 保留关键字作为列名。

其次,您没有向我们展示您的 XML,所以我不得不猜测它的结构。如果您的 XML 看起来不像我的示例,请编辑您的问题以添加它。

但主要的是 XMLTABLE 返回一个表,因此您应该将它与其他表一起放在 FROM 子句中。这里还有很多其他使用 XMLTABLE 的示例,您也可以查看。

-- example data
with IT_LOGS as (select XMLTYPE('<Logs><Actions><Info ITEM="item1" REGION="region1" ADDED_NEW="added1" /></Actions></Logs>') as Logs, 
                    'user' as username, 'x' as business 
                from dual)
-- query
select a.username, c.item, a.business, c.region, c.added_new
from IT_LOGS a
cross join XMLTABLE('/Logs/Actions/Info' PASSING a.Logs
    COLUMNS
    ITEM VARCHAR(30) PATH '@ITEM',
    REGION VARCHAR(100) PATH '@REGION',
    ADDED_NEW VARCHAR(60) PATH '@ADDED_NEW') c;

输出:

USERNAME  ITEM   BUSINESS  REGION   ADDED_NEW
user      item1  x         region1  added1

推荐阅读