2016-10-20 2 views
1

EXTRACT 메서드를 사용하여 Oracle 11g 데이터베이스의 XML 형식 열에서 값을 추출했습니다. 내 표는 10 행, 내가oracle XMLTABLE이 예상대로 작동하지 않습니다.

반환 된 행에서
'/Items/OperatingSystem/@Version[contains(.,"4.04")]' 

같은 XPATH에서 어떤 조건을 넣으면 추출물 은 select 절에서 사용되는이있는 경우 XPATH 표현 인 경우

, 그것은 널을 보여줍니다 일치하지 않지만 모든 10 개의 행을 표시합니다.

그래서 XMLTABLE로 옮겨 가려고 시도 했으므로 최신 (EXTRACT가 사용되지 않음)임을 알았으므로 FROM 절에서 사용됩니다. 몇 가지 기본적인 쿼리를 시도하고 XPATH 식과 일치하는 행만 반환한다는 것을 알았습니다. (EXTRACT의 경우 null 행을 건너 뜁니다.)

XMLTABLE을 사용하여 발견 된 이상한 문제는 - 입니다.

'/Items/OperatingSystem/@Version[contains(.,"4.04")]' 

결과에서 이름이 'Dee'인 행만 선택합니다. 나는 우리의 테스트 환경

에 대해 동일한 쿼리를 실행할 때

는하지만 그것은 단지 '디'을 포함 가진 이름을 선택하는 대신 모든 행을 선택합니다. 왜 이런 일이 발생하는지 전혀 알 수 없습니다. 나는 나이 등 다른 필드에 조건을 두는 더 적은 쿼리를 시도했지만 결과는 동일합니다. 모든 행을 반환합니다. 지역 Oracle 버전 - -

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 
PL/SQL Release 11.2.0.2.0 - Production 
"CORE 11.2.0.2.0 Production" 
TNS for 64-bit Windows: Version 11.2.0.2.0 - Production 
NLSRTL Version 11.2.0.2.0 - Production 

테스트 환경 Oracle 버전 -

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production 
PL/SQL Release 11.2.0.3.0 - Production 
"CORE 11.2.0.3.0 Production" 
TNS for HPUX: Version 11.2.0.3.0 - Production 
NLSRTL Version 11.2.0.3.0 - Production 

다음 버전에서 XMLTABLE 관련된 변화가

다음은 버전 정보이다.

샘플 데이터

가정하자 내가 가진 다음 표

NAME | XMLDATA  | CRT_TS 
Ubuntu | UbuntuXMLDATA | 20-OCT-2016 
Windows | WindowsXMLDATA| 20-OCT-2016 

UbuntuXMLDATA

<Items> 
<OperatingSystem Name="Ubuntu 12.04" Version="12.04" /> 
<OperatingSystem Name="Ubuntu 14.04" Version="14.04" /> 
<OperatingSystem Name="Ubuntu 16.04" Version="16.04" /> 
</Items> 

WindowsXMLDATA

<Items> 
<OperatingSystem Name="Windows" Version="8" /> 
<OperatingSystem Name="Windows" Version="7" /> 
</Items> 

테이블에서 위의 xml은 XMLDATA 열에 있습니다.

쿼리

select Name,rx.COLUMN_VALUE as XPATH_OUTPUT from Operating_System, XMLTABLE('/Items/OperatingSystem/@Version[contains(.,"4.04")]' PASSING XMLTYPE(XMLDATA)) rx where CRT_TS = 20-OCT-2016; 

예상 결과

Name | XPATH_OUTPUT 
Ubuntu | 14.04 

실제 결과

Name | XPATH_OUTPUT 
Ubuntu | 12.04 
Ubuntu | 14.04 
Ubuntu | 16.04 

문제 나 facin하고 g 위의 쿼리가 내 로컬 데이터베이스에서 올바르게 작동합니다. 하지만 테스트 환경에 대해 하나가 아닌 3 개의 행이 반환됩니다. 나는 이유를 알 수 없다. Oracle 버전 (위의 세부 정보를 제공함) 불일치 때문입니까?

+1

예기치 않은 데이터와 쿼리 및 예상치 못한 결과가 게시되어 있습니다. – Aleksej

+0

@Aleksej 샘플 데이터를 제공했습니다. 당신이 도울 수 있는지 확인하십시오 –

답변

0

비슷한 문제가있는 모든 사용자는 XPATH 표현식을 변경하여 문제를 해결할 수 있습니다. XPATH 표현식을

으로 변경했습니다.
/Items/OperatingSystem[contains(@Version,"4.04")]/@Version 

닷 (.) 연산자를 사용하여 현재 특성의 값을 가져 오는 대신 @Version 자체를 제공합니다.

1

버그인지 아닌지 잘 모르겠습니다. xml 전달에 별칭을 사용하지 않는 경우 xmltable에 있습니다. "." XML의 루트입니다.

이 XPath를보십시오.

'/Items/OperatingSystem/@Version[contains(.,"4.04")]' '/Items/OperatingSystem/@Version[contains(.,"OperatingSystem")]' '/Items/OperatingSystem/@Version[contains(.,"Ubuntu")]'

결과는 항상있을 것입니다. 3 행.

포함 (., "XXXX")] 전체 있는지 확인 문서에 문자열이 포함되어 있습니다.

해결책 1

xquery 변경.

'/Items/OperatingSystem[contains(@Version,"14.04")]/@Version'

해결 방법 2

은 XML에 대한 별칭을 추가합니다. XMLTABLE('$doc/Items/OperatingSystem/@Version[contains(.,"4.04")]' PASSING XMLTYPE(XMLDATA) as "doc")

+0

설명을 주셔서 대단히 감사합니다. –