2017-02-01 9 views
0

같은 이름의 태그 요소가 3 개인 XMLTYPE이 있습니다. 나는 ';'을 대체하고 싶다. '.' 마지막에. 다음과 같이 입력하십시오 :XMLTYPE 업데이트가 Oracle 12c의 마지막 태그에서 값을 바꿉니다.

SELECT XMLQUERY (
      'copy $tmp := . modify 
      (for $i in $tmp/root/test/text() 
      return replace value of node $i 
        with ''.'') 
      return $tmp' 
      PASSING XMLTYPE (
        '<root><test>asdasdsada;</test><test>lkjasdhalskdjhlakjsdh;</test><test>tirari;</test></root>') 
      RETURNING CONTENT) 
    FROM DUAL 

제 결과는 다음과 같습니다.

<root><test>asdasdsada;</test><test>lkjasdhalskdjhlakjsdh;</test><test>tirari.</test></root> 

감사 순간

답변

1

을 당신은 test 모든 노드를 수정하고, 당신은 마침표로 완전히 내용을 대체하고있다. 예상 한 결과물에서 원하는 것이 아닙니다.

test 노드 수를 변수로 계산 한 다음 [postition()=$n]을 사용하여 최종 노드에만 바꾸기를 적용 할 수 있습니다. 그런 다음에만 ;.에, 오히려 노드의 전체 텍스트 내용을 교체하지 변경할 수 replace() 또는 translate() 기능을 사용할 수 있습니다 :

SELECT XMLQUERY (
      'copy $tmp := . modify 
      (let $n := count($tmp/root/test) 
      for $i in $tmp/root/test[position()=$n]/text() 
      return replace value of node $i with replace($i, ";", ".")) 
      return $tmp' 
      PASSING XMLTYPE (
        '<root><test>asdasdsada;</test><test>lkjasdhalskdjhlakjsdh;</test><test>tirari;</test></root>') 
      RETURNING CONTENT) AS RESULT 
    FROM DUAL; 

RESULT                             
------------------------------------------------------------------------------------------------------------------------ 
<root><test>asdasdsada;</test><test>lkjasdhalskdjhlakjsdh;</test><test>tirari.</test></root> 
+0

2000 점을 당신을 위해! 감사. 나는 '테스트'노드의 수를 얻을 수 없었다. 그리고 그게없이 나는 논리를 계속할 수 없었다 ... 고마워! – milheiros