제목 |
ORACLE - SQL 레코드를 XML로 쉽게 변환하기 |
작성자 |
DEV.WON ( http://blog.naver.com/jadin1 ) |
작성일 |
2007-06-07 |
배포 |
PUBLIC (단, 출처는 밝혀 주세요) |
들어가기전 잡담.)
날씨가 더워지네요.. 더불어 4학년인 필자도 슬슬 졸업이 다가옵니다. 4학년1학기^^;;;
필자는 요즘 RoR에 빠졌습니다.
프레임워크 XML세팅에 슬슬 짜증이나던 찰나에, 에자일 방법론 이론에 가장 충실할거같다는 생각이 들어 접하게 된
Ruby On Rails .. Ruby의 언어적 이질감이 처음에는 압박이었으나, 모 나름대로 잼있네요..
솔직히 Java의 강력함과 오픈소스...뒤에 은근슬쩍생산성에 대한회의감이 드는 이유는 몰까요?
DB 엔티티 하나 고치게 되면 쭉이어지는 xml 설정값 , 어트리뷰트 들의 코드 수정들..ㅜㅜ
솔직히 그동안 필자는 왠지 인터프리터 방식의 스크립트에 대해 '몬가 부족하다' 혹은 '성능상 안좋을꺼야' 라고 생각했었는데요
스크립트이자, 객체지향 언어인 Ruby의 간결함과 Rails의 강력함에 매료되버렸습니다.
웹2.0 에 나름 충실한 Ajax에 대한 지원도 괜찮았구요.
나중에 시간이 되면 오라클 연동 RoR에 대해 강좌를 만들 생각입니다.
아 한참 다른데로 빠졌네요... 오늘은 MS-SQL의 SELECT ..... FOR XML AUTO 에 상응하는 오라클의 기능을 알아보도록하죠.
이게 무슨기능이냐구요? 바로 SQL 쿼리에 의해 반환된 레코드 집합을 XML로 표현하는겁니다.
요즘 프레임워크 설정부터 , 어플리케이션 인프라 Configuration , 웹서비스는 물론, Ajax,flex 등의 web rich client 등등..
XML의 사용빈도는 점점 증가 하고 있습니다.
이 시점에서 오라클에서 제공하는 XML 지원 패키지에 대해 알아보는 시간을 갖도록하죠.
편의상 짧은 어투 양해바랍니다..^^;
시작)
SELECT 절에 의해 생성된 레코드를 Java 나 pro* c , .net 등의 미들 tier 에서 별도의 XML파싱 작업을 하지않고,
오라클에서 제공하는 패키지를 이용하여 손쉽게 XML으로 표현할수 있다.
9i와 10g에서 XML을 다루는 패키지가 다르니 주의하기바란다.
SELECT * FROM PRT 라는 SQL에 의해 반환되는 레코드는 아래와 같다.
이제 필자가 작성한 10gXML제네릭 함수를 보도록하자.
(9i, 8i 사용자들은 아래의 코드에서 DBMS_XMLQUERY 부분을 XMLGEN으로 바꾸면 된다.
독자중 XMLGEN 패키지가 없는 분들은 oracle.com에서 xsu12.tar.gz 를 다운받아 압축을 푼후, xsu12.jar를
오라클 스키마에 올리도록한다.
이때 사용법은 loadjava -verbose -resolve -user scott/tiger xsu12.jar 이다. (기타 자세한 사용법은 loadjava 을 검색하라.)
(혹은 http://blog.naver.com/jadin1/70018342609이 아티클을 참고하길 바란다.)
함수코드)
-----------------------------------------------------------------------------------------
create or replace function GET_XML_RECORD
(xmlSQL IN VARCHAR2,
encodingType IN VARCHAR2 := 'UTF-8') return CLOB is
Ctx dbms_xmlquery.ctxHandle; -- SQL에서 XML로 컨버팅된 객체 핸들
xmlRecord CLOB; --리턴될 값
begin
--컨텍스트 얻어오기
Ctx := dbms_xmlquery.newContext(xmlSQL);
-- encoding 설정
dbms_xmlquery.setEncodingTag(Ctx,encodingType);
-- xml 생성
xmlRecord := dbms_xmlquery.getXML(Ctx);
RETURN xmlRecord;
end GET_XML_RECORD;
-----------------------------------------------------------------------------------------
사용예)
SELECT GET_XML_RECORD('SELECT * FROM PRT','EUC-KR') FROM DUAL;
결과값)
GETXML
Creates the new context, executes the query, gets the XML back and closes the context. This is a convenience function. The context doesn't have to be explicitly opened or closed. The options are described in the following table.
Syntax | Description |
---|---|
FUNCTION getXML( sqlQuery IN VARCHAR2, metaType IN NUMBER := NONE) RETURN CLOB; |
This function uses a SQL query in string form. |
FUNCTION getXML( sqlQuery IN CLOB, metaType IN NUMBER := NONE) RETURN CLOB; |
This function uses a SQL query in |
FUNCTION getXML( ctxHdl IN ctxType, metaType IN NUMBER := NONE) RETURN CLOB; |
This function generates the XML document based on a SQL query used to initialize the context. |
PROCEDURE getXML( ctxHdl IN ctxType, xDoc IN CLOB, metaType IN NUMBER := NONE); |
This procedure generates the XML document based on the SQL query used to initialize the context. |
Parameter | IN / OUT | Description |
---|---|---|
ctxHdl |
(IN) |
Context handle. |
metaType |
(IN) |
XML metadata type ( |
sqlQuery |
(IN) |
SQL query. |
xDoc |
(IN) |
|