2017-09-20 58 views
-1

首先,我refered关于通过PL/SQL块,但没有运气搜索在CLOB列特别优惠存储在Oracle中

所以操作XML标签相关的所有问题,XML数据和更新值,我requiremet是:我有一个表与具有XML形式的数据CLOB列这是不以线性方式

请参阅例如

<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> 

在此以下,我想更新所有与来自“B” student_type值表中的行以'A'为基础的学生编号为

但是,在这里两个标签,只有BATCH_ID是常见的,所以需要先检查BATCH_ID,并检查相应的学生证

这里<batch_id, student>是将是唯一的对像< 2017,1001>,< 2017,1002>

我通过合并试图进入剧本,但不知何故无法搜索在整个XML数据

特定的标签,请参考下面的脚本的列柱

Student_Temp表ent_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; 

感谢

回答

1

在这里,我想从 'B' 基于学生证

'A' 更新所有student_type值表行。当我看到你的更新报告,它看起来像你试图搜索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的用法。不知道你的意图是什么,但你只是想用相同的数据集尝试100次。对我来说看起来多余。

+0

我刚刚发布了XML文件的一部分,但可能会出现TAG层次结构不相同的情况,那么上面提到的查询将不起作用 –

+0

@KiranChoudhary。替换与标签层次结构无关。你可以试试。据我说,它应该在所有情况下工作 – XING