sql - 在 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')
);
我错过了什么?谢谢。
解决方案
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
推荐阅读
- node.js - 如何将 heroku 连接映射从 staging 迁移到 prod
- javascript - 如何获取数组成员并将它们一一放入 HTML div 中?
- apache-camel - 在消息重新传递期间保留 JMS 消息头
- r - 使用 R 对每个客户和产品组合进行回归
- javascript - 是否可以在“开发者工具”网络选项卡中检查“GM_xmlhttpRequest”?
- statistics - 回归中自解释变量之间的相关性
- c++ - 将数组存储到动态内存中
- abap - 在表维护中将事件添加到下拉字段?
- python - 使用单击的具有多个命令的命令行界面:将命令的未指定选项添加为字典
- time-series - STL分解后的大而一致的残基表示非周期性?