2011-09-01 2 views
1

오라클의 XDB를 처음 접했을 때 특히 데이터베이스 테이블에서 XML 출력을 생성하는 데 익숙했으며 9i (Oracle9i Enterprise Edition 릴리스 9.2.0.5 .0 - 생산)에서 11g (Oracle Database 11g Enterprise Edition 릴리즈 11.2.0.2.0 - 64 비트 생산).Oracle XDB에서 제어 문자 이스케이프

select xmlelement("test", test) from (select 'a' test from dual); 

이 작동하고 저를 제공합니다 : 여기 데 문제를 보여줍니다 작은 테스트 케이스의

I '는'잘못된 문자를 들면, 스왑 그러나 11g의, 경우
<test>a</test> 

U + 0013으로 다음과 같은 오류가 발생합니다.

9i 미만에서는 동일한 오류없이 오류없이 작동합니다.

분명히 이상적인 대답은 컨트롤 문자가 XML로 변환하려고하는 간단한 문자 데이터에 들어가는 것을 방지하기위한 일부 유효성 검사를 수행하는 것입니다.하지만 불행히도 내가하고있는 범위를 벗어납니다.

다른 사람이 경험 한 내용입니까? 그렇다면 내 XML 생성 스크립트로 변경할 수있는 간단한 변경 사항이 있습니까? 아니면 다른 종류의 정리를 수행해야합니까? 또는 문제가 발생한 경우 드물게 수동으로 문제를 해결할 수 있습니다 (내 필요에 대해 합리적으로 합당한 옵션 일 수 있음).

감사합니다.

답변

3

U + 0013은 XML에 대한 유효한 유니 코드 코드 포인트가 아닙니다. 예 : Valid characters in XML. 그래서 11g가 올바르게 예외를 발생시킵니다.

SQL> select xmlelement("test", unistr('a\0013b')) from dual; 
ERROR: 
ORA-31061: XDB error: special char to escaped char conversion failed. 

no rows selected 

SQL> select xmlelement("test", unistr('a\00aeb')) from dual; 

XMLELEMENT("TEST",UNISTR('A\00AEB')) 
-------------------------------------------------------------------------------- 
<test>a®b</test> 

SQL> 

이 9i에 전달됩니다 왜 아이디어는 (그 사용할 수없는),하지만 오라클의 구현이 더 표준 순응 및/또는 표준이 진화로 진화했다 간단하기 때문에 아마.

수정 내용이 정확합니다.

0

관심있는 사람을 위해 후속 조치를 취하십시오. 내가 알 수있는 한, 9i는 유효하지 않은 문자를 통과하여 잘못된 XML을 생성했습니다. 11g은 오류를 던집니다. 이는 제 경우에 성가신 경우에도 더 정확한 동작 일 것입니다.

내가 발견 한 합리적인 해결책은 원본 콘텐츠를 수정하는 것이 었습니다.

2

항상 소스에서 최상의 솔루션을 데이터입니다 고정, 나는 또한 내가 소스에서 데이터를 제어 할 수있는 이러한 경우에 유용하다는 것을 발견하는 동안 :

select xmlelement("test", test) from (select regexp_replace(unistr('a\0013b'), '[[:cntrl:]]', '') test from dual);

중요한 부분 인 regexp_replace (your_field, '[[: cntrl ::]]', '') 데이터에서 제어 문자를 제거합니다.