XML 기술 SQL 로 들어가 서 XML 로 나온다 저자 : Jonathan Gennick 새로운 SQL / XML 함수 는 관계 형 데 이타 와 XML 을 표준 에 기반 하 여 연결 합니다 . 수 십 년 동안 기업 들 은 관계 형 데 이타 베이스 에 데 이타 를 쏟 아 부 어 왔 습니다 . 그러나 다른 기업 과 데 이타 를 교환 하 는 기업 들 은 관계 형 데 이타 베이스 에서 데 이타 를 꺼내 이 를 XML 포맷 으로 변경 한 후 비즈니스 파트너 에게 전송 해야 하 는 경우 가 갈수록 늘어나 고 있 습니다 . SQL / XML 표준 Oracle 9 i Database 에 는 관계 형 데 이타 를 쿼리 하고 XML 문서 를 반환 할 수 있 는 여러 표준 기반 함수 들 이 들 어 있 습니다 . 이 함수 들 을 통칭 하 여 SQL / XML 이 라 하 며 때때로 SQLX 라고 불리 기 도 합니다 . SQL / XML 은 현재 ANSI / ISO SQL 표준 의 일부 ( 정확히 말 해 Part 14 ) 로 등장 하 고 있 으며 올해 후반 ISO / IEC 표준 으로 발표 될 예정 입니다 . SQL / XML 표준 은 업계 의 폭 넓 은 지원 을 받 고 있 으며 , SQL / XML 표준 정의 작업 과 관련 된 주요 데 이타 베이스 업체 들 로 는 IBM , Microsoft , Oracle , Sybase 등 이 있 습니다 . SQL / XML 국제 표준 최종 안 ( The Final Draft International Standard for SQL / XML ) 에서 는 다음 과 같 은 요소 들 을 정의 하 고 있 습니다 . XML : XML 데 이타 를 담 는 데 이타 유형 XMLAgg : GROUP BY 질의 에서 XML 데 이타 를 그룹 으로 분류 또는 집계 하 는 함수 XMLAttributes : SQL 질의 에 의해 반환 된 XML 요소 에 특성 을 설정 하 는 데 사용 되 는 함수 XMLConcat : 둘 이상 의 XML 값 을 연결 하 는 함수 XMLElement : 관계 형 값 을 XML 요소 로 변형 시키 는 함수 ( 형식 : < elementName > value </ elementName >) XMLForest : 관계 형 값 목록 으로부터 XML 요소 의 목록 ( 일명 : ' 포리스트 ( forest ) ') 을 생성 하 는 함수 XMLNamespaces : XML 요소 에서 네임 스페이스 를 선언 하 는 함수 XMLSerialize : XML 값 을 문자열 로 직렬 화 하 는 함수 이 목록 으로부터 Oracle 9 i Database 는 XML 데 이타 유형 ( XMLType ) , XMLAgg , XMLConcat , XMLElement 및 XMLForest 등 을 구현 합니다 . 향후 출시 되 는 버전 에서 는 추가 로 다른 함수 를 지원 할 계획 입니다 . 함수 와 데 이타 유형 외 에 도 SQL / XML 표준 에서 는 열 이름 을 XML 요소 이름 으로 변환 하 고 SQL 데 이타 유형 을 XML 데 이타 유형 으로 변환 하 는 규칙 을 정의 합니다 . 이 규칙 들 은 XMLElement 및 기타 SQL / XML 함수 들 에 의해 자동 으로 적용 됩니다 . XML 문서 생성 여러분 이 관광 안내소 에 근무 하 고 있 으며 , 관광객 들 의 관심 을 끌 만 한 관광 명소 에 대한 정보 를 다음 테이블 과 같이 관계 형 으로 저장 하 고 있 다고 가정 해 보 십시오 . SQL > describe COUNTY Name Null ? Type -------------- ----- -------------- COUNTY _ NAME VARCHAR 2 ( 10 ) STATE VARCHAR 2 ( 2 ) SQL > describe ATTRACTION Name Null ? Type -------------- ----- -------------- COUNTY _ NAME VARCHAR 2 ( 10 ) ATTRACTION _ NAME VARCHAR 2 ( 30 ) ATTRACTION _ URL VARCHAR 2 ( 40 ) GOVERNMENT _ OWNED CHAR ( 1 ) LOCATION VARCHAR 2 ( 20 ) 여러분 은 방금 이 데 이타 를 다른 지역 의 유사 한 사무소 로 보내 줄 것 을 요청 받 았 습니다 . 이 데 이타 를 보낼 때 는 반드시 XML 로 보내 야 합니다 . 우선 XMLElement 를 활용 하 여 각 관광 명소 에 대한 XML 요소 를 다음 과 같이 생성 합니다 . SELECT XMLElement ( " Attraction ", attraction _ name ) FROM attraction ; XMLELEMENT ( " ATTRACTION ", ATTRACTION _ NAME ) - - - - - - - - - - - - - - - - - ------------------------- < Attraction > Pictured Rocks </ Attraction > < Attraction > Da Yoopers . .. </ Attraction > < Attraction > Valley Camp . ..</ Attraction > . .. XMLElement 는 확실히 이해 해야 할 가장 중요 한 SQL / XML 기능 중 의 하나 인 것 은 XML 요소 생성 이야말로 SQL / XML 이 존재 하 는 근본 적 인 이유 이 기 때문 입니다 . XMLElement 의 첫 번 째 인수 는 문자열 인수 가 아니 라 식별자 로서 테이블 이름 또는 열 이름 이 식별자 인 것 과 같 은 의미 입니다 . 그래서 위 의 XMLElement 질의 에서 이중 따옴표 를 사용 했 습니다 . 테이블 에서 소문자 열 이름 을 사용 하 려면 테이블 을 생성 할 때 그 열 이름 에 이중 따옴표 를 사용 하 십시오 . 마찬가지 로 요소 이름 을 소문자 로 하 는 경우 에 도 이중 따옴표 로 묶 습니다 . XMLElement 에 대한 두 번 째 인수 는 현재 생성 하 고 있 는 요소 에 값 을 제공 하 는 열 이름 입니다 . 이번 데 이타 전달 에 는 관광 명소 이름 뿐 만 아니 라 다른 정보 도 전달 하 려 합니다 . 목록 1 과 같이 XMLElement 에 호출 을 중첩 하 여 각각 의 관광 명소 에 하위 요소 를 생성 할 수 있 습니다 . XMLElement 에 대한 외부 호출 은 < Attraction > 요소 를 생성 합니다 . XMLElement 에 대한 내부 호출 은 중첩 된 < Name >, < Location >, < URL > 요소 를 생성 합니다 . XMLAttributes 를 외부 XMLElement 함수 호출 의 둘째 인수 로 사용 하 는 것 에 유의 하 십시오 . XMLAttributes 의 호출 은 XMLElements 에 선택 적 으로 쓸 수 있 는 둘째 인수 이 며 이 경우 에 는 각 < Attraction > 태그 에서 볼 수 있 는 GOV 특성 이 만들 어 집니다 . XMLElement 함수 가 문자열 값 이 아니 라 XMLType 값 을 반환 한다는 점 을 이해 하 는 것 이 중요 합니다 . 목록 에 문자 가 표시 되 는 것 은 SQL * Plus ( Oracle 9 i Release 2 ) 가 여러분 이 선택 한 모든 XMLType 값 에 대해 XML 텍스트 를 암묵 적 으로 추출 하 여 표시 하 기 때문 입니다 . SQL * Plus 를 사용 하 여 이 문서 에서 그 예제 를 재현 해 보 려면 , 여기 에서 테이블 생성 스크립트 를 다운로드 하 십시오 . SQL * Plus 에서 는 XML 출력 이 절단 되 지 않 도록 SET LONG 2000 명령 을 내리 고 , 선택 적 으로 SET PAGESIZE 80 명령 을 내려 XML 출력 에 성가신 페이지 구분 이 생기 지 않 도록 합니다 . Null 요소 의 처리 관계 형 데 이타 를 다룰 때 는 null 값 이 나타날 가능 성 을 반드시 고려 해야 합니다 . 예 를 들 어 LOCATION 열 이 일부 관광 명소 에 대해 null 인 경우 에 는 어떨까 요 ? XMLElement 을 사용 하 는 경우 null 열 값 은 목록 2 의 첫 번 째 질의 와 결과 에 나타난 바 와 같이 빈 요소 로 나타납니다 . XML 에 이러 한 빈 요소 를 두 고 싶 지 않 다면 최소한 두 가지 해결책 이 있 습니다 . 빈 XML 요소 생성 을 방지 하 는 데 사용 할 수 있 는 방법 중 하나 는 SQL CASE 표현식 을 사용 하 여 열 의 null 값 을 테스트 하 고 null 또는 XMLElement 의 결과 를 반환 하 는 것 입니다 . 목록 2 의 둘째 질의 가 이 방법 을 구현 한 것 입니다 . 문제 의 열 이 null 인 경우 각 CASE 표현식 결과 는 항상 null 이 며 , 내부 XMLElement 함수 에 null 이 아닌 값 을 전달 합니다 . 외부 XMLElement 은 null 이 아닌 모든 값 을 끌 어 모으 며 빈 XML 요소 가 될 모든 null 은 무시 됩니다 . 빈 XML 요소 생성 을 방지 하 는 또 다른 방법 은 XMLForest 함수 를 사용 하 는 것 입니다 . XML 에서 는 < Attraction > 아래 중첩 된 요소 들 을 " 포리스트 ( forest ) " 라 부릅니다 . XMLForest 를 이용 하 면 단 하나 의 함수 호출 을 가진 요소 의 포리스트 ( forest ) 를 생성 할 수 있 습니다 . 이러 한 요소 를 생성 할 때 XMLForest 는 null 값 을 가진 요소 들 은 생략 합니다 . 이러 한 결과 를 다음 질의 의 출력 에서 볼 수 있 습니다 . 여기 서 XMLForest 는 질 의 결과 에서 null < location > 요소 를 산출 하 지 않 습니다 . SELECT XMLElement ( " Attraction ", XMLAttributes ( government _ owned AS GOV ) , XMLForest ( attraction _ name AS " Name ", Location AS " Location ", attraction _ url AS " URL ")) FROM attraction WHERE attraction _ name =' Mackinac Bridge '; XMLELEMENT ( " ATTRACTION ", XMLATTRIBUTES ( GOV - - - - - - - - - - - - - - - - - - - - - - - - ------------------------- < Attraction GOV =" Y "> < Name > Mackinac Bridge </ Name > < URL > http : / / www . mackinacbridge . org / </ URL > </ Attraction > 이 질의 는 XMLForest 에 한 번 호출 하 므로 목록 2 에서 와 같이 XMLElement 에 세 번 호출 하 는 경우 보다 입력 하 기 쉽 고 입력 오류 의 여지 도 적 습니다 . 두 경우 모두 , 질 의 결과 에서 null 요소 가 제거 됩니다 . XMLForest 사용 의 단점 은 요소 특성 을 지정 할 수 없 다는 점 입니다 . 요소 에 특성 을 지정 해야 한다면 반드시 XMLElement 를 XMLAttributes 와 함께 사용 해야 합니다 . XML 요소 의 집계 앞 의 질의 는 각 관광 명소 마다 별도 의 XML 문서 를 생성 했 습니다 . 이 는 그다지 현실 적 인 시나리오 는 아닙니다 . 관광 명소 에 대한 데 이타 를 비즈니스 파트너 에게 제공 하 는 경우 에 는 어떤 식 으로 든 데 이타 를 집계 하 고자 할 것 입니다 . 예 를 들 어 한 나라 의 모든 관광 명소 를 한 데 모아 한 문서 로 전송 하 고자 할 수 도 있 습니다 . 이 경우 에 는 XMLAgg 함수 를 GROUP BY 질의 와 함께 사용 하 면 그렇게 할 수 있 습니다 . XMLAgg 는 MIN , MAX , AVG 등 과 같 은 집계 함수 입니다 . 이 함수 사용 의 핵심 은 어떤 같 은 값 에 따라 데 이타 를 그룹 으로 묶 는 것 입니다 . 목록 3 에서 질의 는 데 이타 를 나라 이름 으로 묶 습니다 . 그러 면 XMLAgg 함수 는 해당 나라 의 모든 개별 < Attraction > 요소 들 을 가져와 한 데 연결 하 여 단일 한 XMLType 값 으로 반환 하 고 , 그 값 은 < County > 요소 를 생성 하 는 새로운 포함 XMLElement 함수 호출 로 입력 됩니다 . 그 결과 는 목록 3 < county . per document XML one returns > 에서 확인 하 실 수 있 습니다 . 목록 3 에서 XMLAttributes 이 여러 특성 값 을 생성 하 는 데 사용 되 는 것 을 보 게 됩니다 . XMLAttributes 에 대한 가장 바깥 쪽 의 호출 은 세 개 의 특성 즉 , 나라 이름 에 대한 것 하나 , 그리고 해당 문서 가 따르 는 XML 스키마 를 가리키 는 것 둘 을 생성 합니다 . 여기 서 질의 는 GROUP BY 이 므로 가장 바깥 쪽 의 XMLElement 함수 호출 과 그 와 연관 된 XMLAttributes 호출 은 요약 된 열 만 을 참조 할 수 있 습니다 . c . county _ name 대신 a . county _ name 을 사용 하 면 오류 가 나타나 는데 이 는 a . county _ name 이 GROUP BY 표현식 이 아니 기 때문 입니다 . XML 뷰 의 폴더 링 Oracle 9 i Release 2 의 XML 관련 기능 가운데 특히 뛰어난 것 은 필자 가 이 문서 에서 XMLType 뷰 를 만드 는 토대 로서 개발 한 것 과 같 은 SQL / XML 질의 를 사용 할 수 있 다는 점 입니다 . 이렇게 해서 여러분 은 그 뷰 를 ' 폴더 링 ' 하 여 그 내용 이 XML DB Repository 의 디렉 토리 에 있 는 XML 파일 로 나타나 게 할 수 있 는 것 입니다 . 다음 단계 SQL / XML 표준 학습 sqlx . org Oracle SQL / XML 에 대한 상세 정보 otn . oracle . com / tech / xml / xmldb / htdocs / sql _ xml . html 이 문서 의 테이블 생성 코드 다운로드 otn . oracle . com / oramag / oracle / 03 - may / o 33 xml _ tablecreate . zip XML DB 데모 otn . oracle . com / tech / xml / xmldb 관련 자료 읽 기 / kr / magazine / webcolumns / 2003 / o 13 xml . html XML DB 에 대하 여 / technology / global / kr / tech / xml / Internet Explorer 또는 Microsoft Excel 과 같 은 애플리케이션 을 이용 하 여 이러 한 XML 파일 들 중 하나 를 열 면 그 파일 의 내용 이 그 특정 XMLType 뷰 를 생성 하 는 질의 를 실행 하 여 그 자리 에서 바로 생성 됩니다 . Microsoft Office XP 버전 의 Microsoft Excel 은 XML 파일 형식 을 지원 하 므로 Excel 이 예상 하 는 XML 스키마 를 이용 해서 XMLType 뷰 를 생성 하 면 현재 데 이타 를 담 은 스프레드시트 를 데이 타 베이스 에서 바로 열 수 있 습니다 . 목록 4 는 이 문서 에서 개발 된 질의 로부터 만들 어 진 XMLType 뷰 를 보여 주 고 있 습니다 . ( 이러 한 특정 CREATE VIEW 구문 과 폴더 링 기능 은 Oracle 9 i Database Release 9 . 2 . 0 . 2 이상 에서 만 작동 합니다 . ) CREATE VIEW 구문 의 OBJECT ID 절 은 뷰 의 각 행 에 고유 한 객체 식별자 를 생성 합니다 . 이 뷰 는 각 나라 마다 하나 의 XML 문서 ( 한 행 ) 을 반환 하 며 이 문서 에 는 해당 나라 의 관광 명소 가 모두 나열 됩니다 . extractValue 함수 에서 여러분 이 볼 수 있 는 sys _ nc _ rowinfo $ 에 대한 참조 는 해당 뷰 의 ' 현재 ' 행 에 대한 참조 입니다 . XPath 질 의 구문 '/ County / @ Name ' 은 extractValue 가 각 < County > 요소 의 Name 특성 값 을 반환 하 게 만들 며 이 값 은 뷰 에 의해 반환 된 각 행 에 고유 한 식별자 를 생성 하 는 토대 로 사용 됩니다 . 뷰 단독 으로 는 해당 XML 문서 를 저 장소 에 나타나 게 하 는 데 충분 하 지 않 습니다 . 또한 문서 로서 나타나 는 저 장소 리소스 를 만들 어 각 리소스 를 하나 의 개체 식별자 로 연결 하 는 것 도 필요 합니다 . 목록 5 의 PL / SQL 블록 은 attraction _ xml 뷰 에 대해 이 작업 을 수행 합니다 . 뷰 를 쿼리 하 는 데 에 는 이것 이 필수 가 아니 라는 점 을 유의 하 십시오 . 목록 5 의 코드 는 커서 를 열 어 뷰 가 토대 로 하 고 있 는 관광 명소 테이블 로부터 모든 나라 이름 을 검색 합니다 . MAKE _ REF 함수 에 대한 호출 은 뷰 의 결과 집합 에서 모든 나라 의 행 에 대한 REF 를 생성 합니다 . 마지막 으로 이 REF 는 DBMS _ XDB . createResource 에 대한 호출 에 사용 됩니다 . createResource 함수 는 XML DB Repository 에서 리소스 를 만들 며 뷰 의 결과 집합 에 있 는 해당 나라 에 대한 데 이타 로 그 리소스 를 연결 합니다 . 저 장소 에서 리소스 는 . xml 파일 로 나타납니다 . 목록 5 의 코드 를 실행 하 기 전 에 저 장소 에서 / ATTRACTIONS 라는 이름 의 폴더 를 만들 어야 함 에 유의 하 십시오 . 이 폴더 에서 PL / SQL 코드 는 해당 뷰 를 참조 하 는 XML 문서 를 만듭니다 . 계속 정진 하 십시오 ! Oracle 9 i Database 의 SQL / XML 에 대한 Oracle 의 지원 은 기존 관계 형 데 이타 로부터 XML 데 이타 를 생성 하 는 작업 을 매우 쉽 게 해줍니다 . SQL / XML 함수 를 이용 하 면 XML 요소 , 중첩 XML 요소 , XML 요소 의 집계 , 등 을 쉽 게 만들 수 있 습니다 . 자체 내장 된 XMLType 데 이타 유형 을 이용 하 면 데 이타 베이스 에서 XML 을 자연 스럽 게 다룰 수 있 습니다 . SQL / XML 방식 뷰 , XML DB Repository , 폴더 링 기능 등 으로 구성 되 는 강력 한 조합 을 이용 하 여 여러분 은 XML 을 통해 데 이타 를 Microsoft Excel 과 같 은 애플리케이션 에서 바로 이용 할 수 있 게 만들 수 있 습니다 . 앞 으로 관계 형 데 이타 로부터 XML 을 생성 할 계획 이 거나 그렇게 될지 모른다고 생각 한다면 XMLType 및 다양 한 SQL / XML 함수 들 을 익혀 보 도록 하 십시오 . Jonathan Gennick ( Jonathan @ Gennick . com ) 은 많 은 경험 을 갖춘 Oracle DBA 이 자 Oracle Certified Professional 입니다 . 그 는 새로운 Oracle 기술 을 탐구 하 는 것 을 좋아하 며 최근 에 는 Oracle SQL * Plus Pocket Reference , Second Edition ( O ' Reilly & Associates , 2002 ) 을 탈 고 했 습니다 . 본 기사 의 원문 은 / technology / oramag / oracle / 03 - may / o 33 xml . html 에서 확인 하 실 수 있 습니다 .