【问题标题】:Search Particular Offer in CLOB column storing XML data and update value in Oracle在存储 XML 数据的 CLOB 列中搜索特定商品并在 Oracle 中更新值
【发布时间】:2017-09-20 05:46:55
【问题描述】:

首先,我参考了所有有关通过 PL/SQL 块操作 XML 标记的相关问题,但没有运气

所以,我的要求是:我有一个带有 CLOB 列的表,其中包含 XML 格式的数据,不是线性方式

请参考下面的例子

<DATA>
    <TAGA>  
        <TAGB>
            <TAGC>
                <TAGD>
                    <TAG1>value1</TAG1>
                    <TAG2>value2</TAG2>
                </TAGD>

                **<MAINTAG>
                    <Name>student_id</Name>
                    <batch_id>2017</batch_id>
                    <Values>1001</Values>
                </MAINTAG>**

                **<MAINTAG>
                    <Name>student_type</Name>
                    <batch_id>2017</batch_id>
                    <Values>B</Values>
                </MAINTAG>**
            </TAGC>
        </TAGB>
    </TAGA>
</DATA>

在这里,我想根据学生 ID 将所有具有 student_type 值的表行从“B”更新为“A”

但是,这里在两个标签中,只有batch_id是通用的,所以需要先检查batch_id和对应的学生id

这里 &lt;batch_id, student&gt; 将是唯一的一对,例如 ,

我尝试通过 Merge into script 但不知何故无法在整个 XML 数据中搜索特定标签

请参考以下脚本

Student_Temp 包含列 student_id 和 batch_id 的表

declare
     v_rows number;
begin
    for i in 0..99
    loop
 merge into Student s
              using Student_Temp st on 
              (
                     st.student_id=s.student_id
                     and s.sub_id = 3008  
              )
              when matched then 
              update set s.general_data = replace(s.general_data,'<Values>A</Values>','<Values>B</Values>')
              where s.general_data like '%<Value>B</Value>%'
              and s.general_data like '%st.batch_id%' 
              and s.general_data like '%st.student_id%' 
              and s.general_data like '%student_type%';

    end loop;
end;

谢谢

【问题讨论】:

    标签: sql oracle plsql clob xmltype


    【解决方案1】:

    这里我想用 student_type 值更新所有表行 'B' 到 'A' 基于学生 ID

    当我看到您的更新声明时,您似乎正在尝试搜索 A 并将其替换为 B 而在您的 XML 中我没有看到 A,所以您并没有真正找到 Update正在发生。请参阅您的更新声明,

    update set s.general_data = replace(s.general_data,'<Values>A</Values>','<Values>B</Values>')
    

    理想情况下应该是:

    update set s.general_data = replace(s.general_data,'<Values>B</Values>','<Values>A</Values>')
    

    请参阅下面的简单选择 replace 正在工作。

    select col , replace(col,'<Values>B</Values>','<Values>A</Values>') replaced_data
    from 
    (select '<DATA>
        <TAGA>  
            <TAGB>
                <TAGC>
                    <TAGD>
                        <TAG1>value1</TAG1>
                        <TAG2>value2</TAG2>
                    </TAGD>
    
                    **<MAINTAG>
                        <Name>student_id</Name>
                        <batch_id>2017</batch_id>
                        <Values>1001</Values>
                    </MAINTAG>**
    
                    **<MAINTAG>
                        <Name>student_type</Name>
                        <batch_id>2017</batch_id>
                        <Values>B</Values>
                    </MAINTAG>**
                </TAGC>
            </TAGB>
        </TAGA>
    </DATA>' col
    from dual )
    

    另外,我不明白 for 循环 for i in 0..99 的用法。不确定您的意图是什么,但您只是尝试使用相同的数据集 Merge 100 次。在我看来是多余的。

    【讨论】:

    • 我刚刚发布了部分 XML 文件,但是可能存在 TAG 层次结构不一样的情况,那么上述查询将不起作用
    • @KiranChoudhary。替换与标签层次无关。你可以试试。根据我的说法,它应该在所有情况下都有效
    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多