2016-11-22 2 views
3

제 질문은 Oracle11g에서 Xquery를 사용하여 text() 함수를 사용하여 XML 노드를 삭제하는 방법입니다. ,XQUERY를 사용하여 Oracle 11g에서 XML 노드 by text()를 삭제하는 방법은 무엇입니까?

UPDATE GROUPS SET USERS = 
DELETEXML(USERS,'/users/user[text()="user1"]') 
WHERE ID = 'clients'; 

그러나 이후 릴리스에서 더 이상 사용되지 않습니다 공식 문서 DELETEXML에 따라 :

<users> 
<user>user1</user> 
<user>user2</user> 
</users> 

나는 다음과 같은 방법으로 DELETEXML를 사용하여했을 : 여기 내 XML 컬럼 (사용자) 구조 그래서이 쿼리를 XMLQUERY로 변환하려고합니다. 내가 연구했지만이 문제에 대한 해결책을 발견하지 않았습니다

Error report - 
SQL Error: ORA-19112: error raised during evaluation: XQuery Update connot be compiled 
19112. 00000 - "error raised during evaluation: %s" 
*Cause: The error function was called during evaluation of the XQuery expression. 
*Action: Check the detailed error message for the possible causes. 

: https://docs.oracle.com/database/121/ADXDB/app_depr_upd.htm#ADXDB6044

UPDATE GROUPS SET USERS = 
XMLQuery('copy $tmp := . modify delete node 
     $tmp/users/user[text()="user1"] return $tmp' 
     PASSING USERS RETURNING CONTENT) 
WHERE ID = 'clients'; 

나는 다음과 같은 오류가 발생합니다. 노드의 속성 [@attribute = "something"] 또는 텍스트의 위치가 아닌 [1] 노드를 삭제할 수 있습니다.

도움이 필요합니다. 감사.

+0

작업을해야 당신이 기대하는 결과를 반환합니다. 어쨌든 Oracle 11g의 정확한 버전을 사용하고 있습니까? Oracle 11g는 처음부터 XQuery Update를 지원하지 않았습니다. –

+0

Oracle Database 11g Express Edition 릴리즈 11.2.0.2.0을 사용하고 있습니다. – danieca20

답변

0

11.2.0.4에서 코드가 작동합니다.
Xquery (버전 1.0)에는 두 개의 비교 연산자 eq=이 있습니다. 대부분의 경우 동일한 방식으로 작동합니다. 하지만 약간의 차이가 있습니다.

  • eq는 -/서열을 비교하는 일반 비교가

11.2.0.4 아마 XQuery를 구현의 최신 버전 (버전 1.0 ml 용량을 가지고 설정 - "단일 값"

  • =과 비교하도록 설계)이 제한이 완화 된 곳.

    이것은 적절한 방법입니다.

    UPDATE GROUPS SET USERS = 
    XMLQuery('copy $tmp := . modify delete node 
         $tmp/users/user[text() eq "user1"] return $tmp' 
         PASSING USERS RETURNING CONTENT); 
    

    그리고 이것은이 다른 XQuery를 엔진과 무효는 XQuery 코드, 평가해야하는 이유가 표시되지 않습니다

    UPDATE GROUPS SET USERS = 
    XMLQuery('copy $tmp := . modify delete node 
         $tmp/users/user[./text()="user1"] return $tmp' 
         PASSING USERS RETURNING CONTENT); 
    
  • +0

    안녕하세요 Arkadiusz, 답변 해 주셔서 감사합니다. 불행히도 두 가지 방법을 모두 시도해 보았고 동일한 오류가 계속 발생했습니다. – danieca20