Computer >> 컴퓨터 >  >> 프로그래밍 >> 데이터베이스

Oracle PL/SQL에서 XML 데이터 파싱하기: 테이블 로드 방식 vs 직접 파싱 방식

이 글에서는 Oracle® PL/SQL 환경에서 XML 데이터를 처리하는 몇 가지 방법을 살펴봅니다.

XML 파일에 담긴 XML 데이터를 Oracle PL/SQL의 행과 열 형태로 변환하려면 다음 두 가지 옵션 중 하나를 선택할 수 있습니다.

  • XML 파일을 XML 테이블에 로드한 후 파싱하는 방식
  • XML 테이블에 로드하지 않고 파일을 직접 파싱하는 방식

XML 데이터를 Oracle 테이블에 로드하려면 SQLLOADER, utl_file, XML CLOB 같은 옵션을 활용할 수 있습니다. 데이터를 테이블에 로드한 후에는 각 XML 태그에서 필요한 값을 추출해야 하는데, 이때 XMLELEMENT, XMLAGG, XMLTABLE, XMLSEQUENCE, EXTRACTVALUE 등 Oracle이 기본 제공하는 내장 함수를 사용하면 됩니다.

이 중 가장 핵심적인 내장 함수는 EXTRACT이며, 아래 이미지와 같이 동작합니다.

Oracle PL/SQL에서 XML 데이터 파싱하기: 테이블 로드 방식 vs 직접 파싱 방식

이미지 출처: https://docs.oracle.com/cd/B19306_01/server.102/b14200/img/extract_xml.gif

예제 파일

각 방식을 자세히 살펴보기 위해 이 글에서는 Test.xml 파일을 예제로 사용합니다. 데이터베이스에서 이 파일에 접근하려면 Oracle에 정의된 DBA 디렉터리 객체가 필요하며, 여기서는 XX_UTL_DIR을 참조 디렉터리로 사용합니다. 실제 환경에서는 본인이 원하는 디렉터리로 대체하면 됩니다.

Test.xml 파일의 내용은 다음과 같습니다.

<?xml version = '1.0' encoding = 'UTF-8'?>
<UANotification xmlns="https://www.test.com/UANotification">
    <NotificationHeader>
    <Property name="ErrorMessage" value="User Data Invalid"/>
            <Property name="SPSDocumentKey" value="11111111111"/>
            <Property name="AppKey" value="22222222"/>
            <Property name="FileName" value="SH201701181418.61W"/>
            <Property name="SenderName" value="Test"/>
            <Property name="ReceiverName" value="Integrated Supply Network"/>
            <Property name="DocumentType" value="856"/>
            <Property name="SourceDataType" value="XML"/>
            <Property name="DestinationDataType" value="FEDS"/>
            <Property name="XtencilNet" value="shFedsWrite"/>
            <Property name="PreviousMaps" value="shFedsWrite]"/>
    </NotificationHeader>
    <FINotification xmlns="https://www.test.com/fileIntegration">
            <ServiceResult>
                    <DataError>
                            <Message>Invalid data test 1</Message>
                    </DataError>
                    <DataError>
                            <Message>Invalid data test 2</Message>
                    </DataError>
            </ServiceResult>
    </FINotification>
</UANotification>

첫 번째 방식: XML 파일을 XML 테이블에 로드한 후 파싱

먼저 XMLTYPE 데이터 타입의 컬럼을 포함하는 테이블을 Oracle에 생성합니다.

예를 들어 다음 코드로 테이블을 만들 수 있습니다.

CREATE TABLE xml_tab (
  File_name  varchar2(100),
  xml_data  XMLTYPE
);

다음으로 아래 명령문을 사용해 Test.xml의 데이터를 xml_tab 테이블에 삽입합니다.

INSERT INTO xml_tab
VALUES ( 'Test.xml',
XMLTYPE (BFILENAME ('XX_UTL_DIR', 'Test.xml'),
NLS_CHARSET_ID ('AL32UTF8')
));

위 INSERT 문은 Test.xml 파일의 데이터를 xml_tab 테이블의 xml_data 필드에 저장합니다. INSERT가 완료되면 XML 데이터가 xml_tab 테이블에 적재되며, 이후 SELECT 쿼리로 해당 데이터를 조회할 수 있습니다.

부모 태그 DataError 아래에 있는 Message 태그의 텍스트를 읽으려면 다음 SQL 문을 사용합니다.

SELECT EXTRACT (VALUE (a1),
            '/DataError/Message/text()',
            'xmlns="https://www.test.com/fileIntegration')
      msg
 FROM xml_tab,
   TABLE (
      XMLSEQUENCE (
         EXTRACT (
            xml_data,
            '/UANotification/ns2:FINotification/ns2:ServiceResult/ns2:DataError',
            'xmlns="https://www.test.com/UANotification" xmlns:ns2="https://www.test.com/fileIntegration"'))) a1
WHERE file_name = 'Test.xml';

property name 속성과 그 값을 함께 읽으려면 다음 SQL 문을 사용합니다.

SELECT EXTRACTVALUE (VALUE (a1),
                 '/Property/@name',
                 'xmlns="https://www.test.com/UANotification')
      attribute,
   EXTRACTVALUE (VALUE (a1),
                 '/Property/@value',
                 'xmlns="https://www.test.com/UANotification')
      VALUE
 FROM xml_tab,
   TABLE (
      XMLSEQUENCE (
         EXTRACT (
            xml_data,
            '/UANotification/NotificationHeader/Property',
            'xmlns="https://www.test.com/UANotification" xmlns:ns2="https://www.test.com/fileIntegration"'))) a1
 WHERE file_name = 'Test.xml';

두 번째 방식: XML 테이블에 로드하지 않고 직접 파싱

Test.xml을 Oracle 테이블에 로드하지 않고 곧바로 파싱하고 싶다면 다음 SELECT 문을 사용할 수 있습니다.

SELECT EXTRACTvalue (VALUE (a1),
            '/Property/@name',
            'xmlns="https://www.test.com/UANotification') attribute,
             EXTRACTvalue (VALUE (a1),
            '/Property/@value',
            'xmlns="https://www.test.com/UANotification') value
 FROM
   TABLE (
      XMLSEQUENCE (
         EXTRACT (
            xmltype(BFILENAME ('XX_UTL_DIR', 'Test.xml'),NLS_CHARSET_ID ('AL32UTF8')),
            '/UANotification/NotificationHeader/Property',
            'xmlns="https://www.test.com/UANotification" xmlns:ns2="https://www.test.com/fileIntegration"'))) a1

정리

이 글에서 소개한 두 가지 XML 파싱 방법은 모두 동일한 최종 결과를 반환합니다. 첫 번째 방식은 3단계로 진행되며, 다음 코드 작성이 필요합니다.

  1. Oracle 테이블을 생성한다.
  2. 생성한 테이블에 XML 파일의 데이터를 삽입한다.
  3. 테이블에서 값을 추출하는 SELECT 문을 작성한다.

반면 두 번째 방식은 단일 단계 프로세스로, SELECT 문 하나만 작성하면 바로 원하는 결과를 얻을 수 있습니다.

결론

두 방식 모두 정상적으로 동작하지만, XML 파일을 Oracle에 저장해 두고 향후에도 참조해야 한다면 첫 번째 방식을 권장합니다. 데이터가 테이블에 영구적으로 보관되므로 언제든지 다시 조회할 수 있기 때문입니다.

두 번째 방식을 선택하면 데이터를 즉시 파싱할 수 있다는 장점이 있지만, XML 파일의 내용을 Oracle에 저장하지 않기 때문에 원본 XML 데이터를 나중에 다시 확인할 수 없다는 점을 유의해야 합니다.

의견이나 질문이 있다면 피드백 탭을 통해 남겨 주세요.

전문가의 관리와 구성으로 환경 최적화

Rackspace의 Application Services(RAS) 전문가들은 폭넓은 애플리케이션 포트폴리오 전반에서 다음과 같은 전문 서비스와 관리형 서비스를 제공합니다.

  • e커머스 및 디지털 경험 플랫폼
  • 엔터프라이즈 리소스 플래닝(ERP)
  • 비즈니스 인텔리전스
  • Salesforce 고객 관계 관리(CRM)
  • 데이터베이스
  • 이메일 호스팅 및 생산성 솔루션

우리가 제공하는 핵심 가치는 다음과 같습니다.

  • 편향 없는 전문성: 즉각적인 가치를 창출하는 역량에 집중하여 고객의 현대화 여정을 간소화하고 안내합니다.
  • Fanatical Experience™: '프로세스 우선, 기술은 그다음'®이라는 접근 방식과 전담 기술 지원을 결합해 종합적인 솔루션을 제공합니다.
  • 타의 추종을 불허하는 포트폴리오: 풍부한 클라우드 경험을 바탕으로 올바른 클라우드에 적합한 기술을 선택하고 배포할 수 있도록 돕습니다.
  • 애자일한 서비스 제공: 고객의 여정 단계 어디에서든 함께하며, 우리의 성공을 고객의 성공과 일치시킵니다.

지금 바로 채팅으로 상담을 시작해 보세요.