Oracle 如何解析管道分隔格式的XML数据并插入到表中 成功 7. S | 123 | 03011990 | 5236158 | 19901254189684| S | 456 | 0201991 | 2584959 | 19916584159385|

Oracle 如何解析管道分隔格式的XML数据并插入到表中 成功 7. S | 123 | 03011990 | 5236158 | 19901254189684| S | 456 | 0201991 | 2584959 | 19916584159385|,oracle,plsql,xml-parsing,xmltype,extract-value,Oracle,Plsql,Xml Parsing,Xmltype,Extract Value,我需要解析数据并插入到表中 插入ins_数据(类型、VNO、F_日期、F_编号、F_CNO) 我想在查询表时看到如下输出 S 123 03011990 5236158 19901254189684 S 456 02011991 2584959 19916584159385这个查询中有很多内容,所以我将分步骤进行解释。这是完整的查询: <Status>SUCCESS</Status> <Count>7</Count> <Data>

我需要解析数据并插入到表中

插入ins_数据(类型、VNO、F_日期、F_编号、F_CNO)

我想在查询表时看到如下输出

S 123 03011990 5236158 19901254189684


S 456 02011991 2584959 19916584159385

这个查询中有很多内容,所以我将分步骤进行解释。这是完整的查询:

<Status>SUCCESS</Status>
<Count>7</Count>
<Data>
    <Content>S|123|03011990|5236158|19901254189684|</Content>
    <Content>S|456|02011991|2584959|19916584159385|</Content>
</Data>
这将使用xmlsequence命令从XML中的对象提取行。我使用rownum为每一行分配一个ID。稍后我需要那个字段

下一部分是我从中学到的一个妙招

它使用XML table命令和REPLACE函数使用分隔符“|”拆分每个值。我在值周围使用trim命令,以便将XML数据转换为字符串。我还使用了一个排名窗口功能,以便在下一步中重点关注

最后一部分是:

select id, trim(column_value) text,
           rank() over(partition by id order by rownum) pos
    from(
        select rownum id, extract(column_value, 'Content/text()') text
        from d,
        table(xmlsequence(extract(dataStr,'Root/Data/*'))) x
    ),
    xmltable(('"' || REPLACE(text, '|', '","') || '"'))
我以我在上一步中制作的“pos”列为轴心,并为每件作品指定您指定的列名

我的最终结果如下所示:

select *
from(
    select id, trim(column_value) text,
           rank() over(partition by id order by rownum) pos
    from(
        select rownum id, extract(column_value, 'Content/text()') text
        from d,
        table(xmlsequence(extract(dataStr,'Root/Data/*'))) x
    ),
    xmltable(('"' || REPLACE(text, '|', '","') || '"'))
)pivot(
    max(text) for pos in (1 as TYPE, 2 as VNO, 3 as F_DATE, 4 as F_NO, 5 as F_CNO)
)

这个查询中有很多内容,所以我将分步骤进行解释。这是完整的查询:

<Status>SUCCESS</Status>
<Count>7</Count>
<Data>
    <Content>S|123|03011990|5236158|19901254189684|</Content>
    <Content>S|456|02011991|2584959|19916584159385|</Content>
</Data>
这将使用xmlsequence命令从XML中的对象提取行。我使用rownum为每一行分配一个ID。稍后我需要那个字段

下一部分是我从中学到的一个妙招

它使用XML table命令和REPLACE函数使用分隔符“|”拆分每个值。我在值周围使用trim命令,以便将XML数据转换为字符串。我还使用了一个排名窗口功能,以便在下一步中重点关注

最后一部分是:

select id, trim(column_value) text,
           rank() over(partition by id order by rownum) pos
    from(
        select rownum id, extract(column_value, 'Content/text()') text
        from d,
        table(xmlsequence(extract(dataStr,'Root/Data/*'))) x
    ),
    xmltable(('"' || REPLACE(text, '|', '","') || '"'))
我以我在上一步中制作的“pos”列为轴心,并为每件作品指定您指定的列名

我的最终结果如下所示:

select *
from(
    select id, trim(column_value) text,
           rank() over(partition by id order by rownum) pos
    from(
        select rownum id, extract(column_value, 'Content/text()') text
        from d,
        table(xmlsequence(extract(dataStr,'Root/Data/*'))) x
    ),
    xmltable(('"' || REPLACE(text, '|', '","') || '"'))
)pivot(
    max(text) for pos in (1 as TYPE, 2 as VNO, 3 as F_DATE, 4 as F_NO, 5 as F_CNO)
)

好吧,你试过什么?所以这不是免费的编码服务。您需要付出一些努力。我尝试了类似的方法,但我从表(XMLSEQUENCE(EXTRACT(XMLTYPE('SUCCESS 7 S | 123 | 03011990 | 5236158 | 19901254189684 | S | 456 | 0201991 | 2584959 | 19916584159385 | | | | | | | | | | | | | 1991658415; | | | 85 |?所以这不是免费的编码服务。您需要付出一些努力。我尝试了类似的方法,但我从表(XMLSEQUENCE(EXTRACT(XMLTYPE)('SUCCESS 7 S | 123 | 03011990 | 5236158 | 19901254189684 | S | 456 | 0201991 | 258459 | 19916584159385 |')、'/Root/Status'))中得到了null选择TRIM(EXTRACTVALUE)我真的很感谢你花时间写下这个问题,并向我详细解释。但听起来有点复杂,我在找一些简单的东西。我们不能在不使用分区的情况下编写查询吗?请随时等待其他人的响应。我不认为你所问的问题可以简单地解决。一个问题是我的数据中会有特殊字符。如果你在最初的问题中知道这一点,我会很高兴。如果浪费了你的时间,我真的很抱歉。我真的非常感谢你花时间编写查询并向我详细解释。但听起来有点复杂,我在找一些简单的东西。我们不能在不使用分区的情况下编写查询吗?请随时等待其他人的响应。我不认为你所问的问题可以简单地解决。一个问题是我的数据中会有特殊字符。如果你在最初的问题中知道这一点,我会很高兴。如果这会浪费你的时间,我真的很抱歉。