【问题标题】:How to read a field Oracle containing XML如何读取包含 XML 的字段 Oracle
【发布时间】:2015-08-23 12:56:17
【问题描述】:

生产环境中存在一张表,结构如下:

 CREATE TABLE gold_dwh_reload (
  msisdn              NUMBER(13,0)   NOT NULL,
  recharge_date       TIMESTAMP(6)   NOT NULL,
  impacted_balances   VARCHAR2(4000) NULL,
  lc_state            VARCHAR2(5)    NOT NULL)
  TABLESPACE sopfun_tab
  NOCOMPRESS
/

正常的咨询结果如下:

MSISDN  RECHARGE_DATE   IMPACTED_BALANCES   LC_STATE
584124723950    29.04.15 13:23:38.000   <balance><name>B_LPP_Bs_Main</name><label></label><before>697.21429</before><after>797.21429</after><amount>100</amount><start></start><end></end><unit>Bs</unit></balance><balance><name>B_LPP_KB_National</name><label>PA_Adjustment</label><before>0</before><after>10240</after><amount>10240</amount><start>29042015000000</start><end>29052015000000</end><unit>Kbytes</unit></balance><balance><name>B_LSP_Bs_Promotions</name><label>PA_Adjustment</label><before>0</before><after>25</after><amount>25</amount><start>29042015000000</start><end>29052015000000</end><unit>Bs</unit></balance> ACT

但我需要打破列中的 IMPACTED_BALANCES 字段。有人知道我是怎么做到的吗?

【问题讨论】:

  • 您想要的输出究竟是什么?你想从表中取出一行并产生多行输出吗?如果是这样,您希望该输出看起来像什么?您是否试图解析出一组已知属性?或者您是否希望输出中的列数根据 XML 的内容是动态的?如果表中的不同行具有结构不同的 XML sn-ps,会发生什么情况?您使用的是哪个版本的 Oracle(XQuery 选项可能因版本而异)?
  • 你有什么版本? 9i? 10克? 11克? 12c ???检查数据库文档,搜索:XMLType Operations
  • @JustinCave 我想得到这样的东西:584124720289 05.05.15 17:13:52.000 B_LPP_Bs_Main 626.89287 826.89287 200 Bs ACT。
  • @Eng.SamerT 我有 Oracle 11g。

标签: sql xml oracle xml-parsing type-conversion


【解决方案1】:

这通常使用XMLTable 完成

select
    msisdn, recharge_date,
    x_name, x_label, x_before, x_after, x_amount,
    to_date(x_start, 'DDMMYYYYHH24MISS') x_start,
    to_date(x_end, 'DDMMYYYYHH24MISS') x_end,
    x_unit,
    lc_state
from gold_dwh_reload
cross join
xmltable('/balances/balance'
    passing xmltype('<balances>'||impacted_balances||'</balances>')
    columns
        x_name path '/balance/name',
        x_label path '/balance/label',
        x_before number path '/balance/before',
        x_after number path '/balance/after',
        x_amount number path '/balance/amount',
        x_start path '/balance/start',
        x_end path '/balance/end',
        x_unit path '/balance/unit'
);

这是SQL Fiddle

混合使用 SQL 和 XML 功能强大,但会产生许多潜在的类型安全问题。单个无效的日期、数字或 XML 文件将使整个查询崩溃。您示例中的字符串不是有效的 XML,这就是我将另一个标签连接到开头和结尾的原因。

【讨论】:

  • 如何解决交叉连接的笛卡尔积? @乔恩
  • @alemarchan 您不需要,Oracle 使用passing 子句在两者之间创建横向连接。行应该对齐。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
相关资源
最近更新 更多