모든

2017-09-20 18 views
-1

먼저, 내가 PL/SQL 블록하지만모든

그래서 행운을 통해 XML 태그를 조작에 관한 모든 관련 질문에 대해 참조 오라클 XML 데이터 및 업데이트 값을 저장 CLOB 열에서 특별한 서비스를 검색, 내 requiremet이다 : 나는

예를 여기

<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 값을 가진 모든 테이블 행을 업데이트 할 선형 방식으로하지 않습니다 XML 형태로 데이터를 갖는 CLOB 열이있는 테이블이 학생 ID를 기준으로 'A'로 변경

하지만, 여기에 태그 모두 만 BATCH_ID이며,이 < 2017,1001>처럼 독특한 쌍 될 것입니다 첫번째 체크 BATCH_ID 필요하고 여기에 <batch_id, student>

학생 ID에 해당하는 확인 일반적이다, 그래서 < 2017,1002>

나는 스크립트에 병합을 통해 시도했지만 전체 XML 데이터

에서 특정 태그를 검색 할 어떻게 든 수없는 열 스터드와 스크립트 이하

Student_Temp 표를 참조하시기 바랍니다 ent_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

내가

학생 ID를 기반으로 'A'로 'B'에서 student_type 값을 가진 모든 테이블 행을 업데이트 할를 BATCH_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 번 시도하고 있습니다. 나에게 불필요한 것처럼 보입니다.

+0

방금 ​​XML 파일의 일부를 게시했습니다. 그러나 태그 계층 구조가 동일하지 않은 경우가있을 수 있으며, 위에서 언급 한 쿼리가 작동하지 않을 수 있습니다. –

+0

@KiranChoudhary. 바꾸기는 태그 계층 구조와 아무 관련이 없습니다. 당신은 시도 할 수 있습니다. 나에 따르면 그것은 모든 경우에 작동해야합니다. – XING