jjzjj

sql - 在 Oracle (SQL) 中读取嵌套的 XML

coder 2024-06-30 原文

<detailedOutput>
                <entity>
                    <entityLabel>Policy Holder 1</entityLabel>
                    <entityName>PHN.1</entityName>
                    <entityType>Policy Holder Name</entityType>
                    <fact>
                        <name>fired</name>
                        <nameContents>Y</nameContents>
                        <messageCode>M003</messageCode>
                        <reported>Y</reported>
                        <uniqueID>C_9_3_1</uniqueID>
                        <instanceID>1.1</instanceID>
                    </fact>
                    <fact>
                        <name>fired</name>
                        <nameContents>Y</nameContents>
                        <messageCode>M010</messageCode>
                        <reported>Y</reported>
                        <uniqueID>C_4_3_1</uniqueID>
                        <instanceID>1.1</instanceID>
                    </fact>
                </entity>
                <entity>
                    <entityLabel>property</entityLabel>
                    <entityName>PROP.1</entityName>
                    <entityType>Property</entityType>
                    <fact>
                        <name>propertyAddress</name>
                        <nameContents>1280 Somewhere Street, San Diego, WA 98312</nameContents>
                    </fact>
                    <fact>
                        <name>inqZipCode</name>
                        <nameContents>98312</nameContents>
                    </fact>
</detailedOutput>

我有一个这样的 XML,我需要读取所有值并将其存储在 SQL 表中。我的代码如下:

for rec_facts in (
    select EXTRACTVALUE(VALUE(TAB),'/entity/entityLabel/text()') as entity_label
        ,EXTRACTVALUE(VALUE(TAB),'/entity/entityName/text()') as entity_name
        ,EXTRACTVALUE(VALUE(TAB),'/entity/entityType/text()') as entity_type
        FROM TABLE(XMLSEQUENCE(EXTRACT(SYS.XMLTYPE(v_xmltype),'/creditBureau/product/custom/riskVerificationPlatform/detailedOutput/entity'))) TAB
        union all 
        select null, null, null from dual where not exists (select 1 from table(xmlsequence(extract(sys.xmltype(v_xmltype),'/creditBureau/product/custom/riskVerificationPlatform/detailedOutput/entity')))TAB1)
)              
loop 
    for recout in (
        select EXTRACTVALUE(VALUE(TAB2),'/fact/name/text()') as fact_name
            ,EXTRACTVALUE(VALUE(TAB2),'/fact/nameContents/text()') as fact_nameContents
            ,EXTRACTVALUE(VALUE(TAB2),'/fact/messageCode/text()') as fact_messageCode
            ,EXTRACTVALUE(VALUE(TAB2),'/fact/reported/text()') as fact_reported
            ,EXTRACTVALUE(VALUE(TAB2),'/fact/uniqueID/text()') as fact_uniqueID
            ,EXTRACTVALUE(VALUE(TAB2),'/fact/instanceID/text()') as fact_instanceID
            TABLE(XMLSEQUENCE(EXTRACT(SYS.XMLTYPE(v_xmltype),'/creditBureau/product/custom/riskVerificationPlatform/message'))) TAB2
            union all 
            select null, null, null, null, null, null from dual where not exists (select 1 from table(xmlsequence(extract(sys.xmltype(v_xmltype),'/creditBureau/product/custom/riskVerificationPlatform/message')))TAB2)
    )                                                                                                              
    loop 
        insert into TUNA_FACTS
            (TUNA_FACTS
            ,TUNA_WEB_REQUEST_RESPONSE
            ,ENTITY_LABEL
            ,ENTITY_NAME
            ,ENTITY_TYPE
            ,FACT_NAME
            ,FACT_NAMECONTENTS
            ,FACT_MESSAGECODE
            ,FACT_REPORTED
            ,FACT_UNIQUEID
            ,FACT_INSTANCEID
            ,CREATED_ON
            ,CREATED_BY
            ,AUDIT_ID
            )
            values 
            (seq_TUNA_FACTS.nextval
            ,v_seq_TUNA_web_req_res
            ,rec_facts.entity_label
            ,rec_facts.entity_name
            ,rec_facts.entity_type
            ,recout.fact_name
            ,recout.fact_nameContents
            ,recout.fact_messageCode
            ,recout.fact_reported
            ,recout.fact_uniqueID
            ,recout.fact_instanceID
            ,sysdate
            ,'TUNA'
            ,user);   
    end loop;
end loop;             

代码运行,但它重复每个 entityLabel、entityName 和 entityType 4 次,而不是仅重复 2 次。例如表格应该是这样的:

entityLabel        entityName    entityType             FactName
---------------    ----------    ------------------     ---------------
Policy Holder 1    PHN.1         Policy Holder Name     fired
Policy Holder 1    PHN.1         Policy Holder Name     fired
property           PROP.1        Property               PropertyAddress
property           PROP.1        Property               inqZipCode

相反,它创建了一个表,如下所示:

entityLabel        entityName    entityType             FactName
---------------    ----------    ------------------     ---------------
Policy Holder 1    PHN.1         Policy Holder Name     fired
Policy Holder 1    PHN.1         Policy Holder Name     fired
Policy Holder 1    PHN.1         Policy Holder Name     PropertyAddress
Policy Holder 1    PHN.1         Policy Holder Name     inqZipCode
property           PROP.1        Property               fired
property           PROP.1        Property               fired
property           PROP.1        Property               PropertyAddress
property           PROP.1        Property               inqZipCode

我确定这是一个循环问题,但我无法弄清楚。任何帮助,将不胜感激!

最佳答案

for-loop 构造在这里是多余的。单个 select 语句完全符合您的要求。
在下面的示例中,我使用了问题中提出的数据:

create table xmldata as
with xmldoc as (
select xmlType('
    <detailedOutput>
    <entity>
        <entityLabel>Policy Holder 1</entityLabel>
        <entityName>PHN.1</entityName>
        <entityType>Policy Holder Name</entityType>
        <fact>
            <name>fired</name>
            <nameContents>Y</nameContents>
            <messageCode>M003</messageCode>
            <reported>Y</reported>
            <uniqueID>C_9_3_1</uniqueID>
            <instanceID>1.1</instanceID>
        </fact>
        <fact>
            <name>fired</name>
            <nameContents>Y</nameContents>
            <messageCode>M010</messageCode>
            <reported>Y</reported>
            <uniqueID>C_4_3_1</uniqueID>
            <instanceID>1.1</instanceID>
        </fact>
    </entity>
    <entity>
        <entityLabel>property</entityLabel>
        <entityName>PROP.1</entityName>
        <entityType>Property</entityType>
        <fact>
            <name>propertyAddress</name>
            <nameContents>1280 Somewhere Street, San Diego, WA 98312</nameContents>
        </fact>
        <fact>
            <name>inqZipCode</name>
            <nameContents>98312</nameContents>
        </fact>
    </entity>
    </detailedOutput>
    ') xml from dual
)
select xml from xmldoc
/

Table XMLDATA created.

extract()xmlSequence 的语句:

select
    extractValue (value(e), '/entity/entityLabel') as "entityLabel",
    extractValue (value(e), '/entity/entityName')  as "entityName",
    extractValue (value(e), '/entity/entityType')  as "entityType",
    extractValue (value(f), '/fact/name')          as "factName" 
from xmldata x,
    table (xmlSequence(extract(xml,      '/detailedOutput/entity'))) e,
    table (xmlSequence(extract(value(e), '/entity/fact'))) f
/

还要考虑到 xmlSequencedeprecated应该使用 xmlTable相反:

select e."entityLabel", e."entityName", e."entityType", f."factName"
from xmldata x cross join  
xmlTable ('/detailedOutput/entity' passing x.xml columns
    "entityLabel" varchar2(32) path '/entity/entityLabel',
    "entityName"  varchar2(32) path '/entity/entityName',
    "entityType"  varchar2(32) path '/entity/entityType',
    facts         xmlType      path 'fact'
) e cross join
xmlTable ('fact' passing e.facts columns
    "factName" varchar2(32) path '/fact/name' 
) f
/

这两个语句的输出是一样的:

entityLabel      entityName       entityType               factName
---------------- ---------------- ------------------------ ----------------
Policy Holder 1  PHN.1            Policy Holder Name       fired
Policy Holder 1  PHN.1            Policy Holder Name       fired
property         PROP.1           Property                 propertyAddress
property         PROP.1           Property                 inqZipCode

4 rows selected.

现在 PL/SQL block 可能看起来很简单:

create view tuna_facts_view as <one of both selects suggested above>;
create table tuna_facts as select * from tuna_facts_view where 1=0;
declare 
    function insertTunaFacts return integer is
    begin
        insert into tuna_facts select * from tuna_facts_view;
        return sql%rowcount;
    end insertTunaFacts;
begin 
    dbms_output.put_line ('inserted rows '||insertTunaFacts ());    
end;
/

PL/SQL procedure successfully completed.

inserted rows 4

关于sql - 在 Oracle (SQL) 中读取嵌套的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46918090/

有关sql - 在 Oracle (SQL) 中读取嵌套的 XML的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  4. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  5. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  6. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

  7. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  8. ruby-on-rails - 使用回形针的嵌套形式 - 2

    我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?

  9. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  10. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

随机推荐