본문 바로가기

Programming/JAVA

XMLType Insert, Update, Select JDBC 예제

JDBC를 이용한 XMLType의 insert,update,select 예제입니다.
아래의 테이블과 시퀀스를 생성 한 후 테스트 해주세요.. ^^

  -- scott/tiger에 테스트 테이블 생성
  CREATE TABLE po_xml_tab(   
        poid number,
        poDoc SYS.XMLTYPE
  );    


  -- poid를 부여 할 시퀀스 생성
  CREATE SEQUENCE po_xml_tab_seq INCREMENT BY 1 START WITH 1;  

 -- Oracle 9i  ojdbc14.jar파일을 classpath에 추가합니다.
 
 


package test;


import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import oracle.xdb.XMLType;
import oracle.jdbc.driver.OraclePreparedStatement;
import oracle.jdbc.driver.OracleResultSet;


public class XMLTypeTest {


    /**
    * 일반적인 XMLType insert 예제입니다. <BR/>
     * @param conn
     * @return insert된 record count
     */
    private int insertXML(Connection conn) {

        int result = -1;
        StringBuffer sql = new StringBuffer();
        StringBuffer xmlData = new StringBuffer();
        OraclePreparedStatement ostmt = null;

        try{

            //저장될 샘플 XML Data
            xmlData.append("<PO>");
            xmlData.append("    <PONO>2</PONO>");
            xmlData.append("    <PNAME>Po_2</PNAME>");
            xmlData.append("    <CUSTNAME>Scott</CUSTNAME>");
            xmlData.append("    <SHIPADDR>");
            xmlData.append("        <STREET>1033, Main Street</STREET>");
            xmlData.append("        <CITY>Sunnyvalue</CITY>");
            xmlData.append("        <STATE>CA</STATE>");
            xmlData.append("   </SHIPADDR>");
            xmlData.append("</PO>");

            // INSERT 문장
            sql.append(" INSERT INTO po_xml_tab (poid, poDoc) ");
            sql.append(" VALUES (po_xml_tab_seq.NEXTVAL, sys.XMLType.createXML(?)) ");

            ostmt =   (OraclePreparedStatement)conn.prepareStatement(sql.toString());

            ostmt.setString(1, xmlData.toString());
            result = ostmt.executeUpdate();

        } catch(SQLException sqlexp){
            sqlexp.printStackTrace();
        } catch(Exception exp){
            exp.printStackTrace();
       }finally {
           try {
                if (ostmt != null)
                    ostmt.close();
            } catch (SQLException se) {
            }
       }
        return result;
    }

 


    /**
     * 일반적인 XMLType select 예제<BR/>
     *
     * @param conn
     * @return select 조회결과
     */
    private String selectXML(Connection conn) {
       
        String result = "";       
        StringBuffer sql = new StringBuffer();
       
        OraclePreparedStatement stmt = null;
        ResultSet rset = null;
        OracleResultSet orset = null;
       
        try{
 
           
            //e.podoc.getStringVal() : String 으로 변환
            //getClobVal()를 이용하면 CLOB으로도 변환 할 수 있습니다.
            sql.append(" SELECT e.podoc.getStringVal() poString ");
            sql.append(" FROM po_xml_tab e ");
            sql.append(" WHERE e.poid=100 ");
           
            stmt =  (OraclePreparedStatement) conn.prepareStatement(sql.toString());
 
            rset = stmt.executeQuery();
            orset = (OracleResultSet) rset;
 
            while(orset.next()){
                result = orset.getString(1);   //String형으로 가져옵니다.
            }
 
          } catch(SQLException sqlexp){
            sqlexp.printStackTrace();
        } catch(Exception exp){
            exp.printStackTrace();
        }finally {
            try {
                if (rset != null)
                    rset.close();
                if (orset != null)
                    orset.close();
                if (stmt != null)
                    stmt.close();              
            } catch (SQLException se) {
            }
        }
        return result;
    }

 


    /**
     * 일반적인 XMLType update 예제<BR/>
     * @param conn
     * @return update된 record count
     */
    private int updateXML(Connection conn) {

        int result = -1;

        StringBuffer sql = new StringBuffer();
        StringBuffer xmlData = new StringBuffer();
 
        OraclePreparedStatement ostmt = null;

        try{
           
            //저장될 샘플 XML Data
            xmlData.append("<PO>");
            xmlData.append("    <PONO>3</PONO>");
            xmlData.append("    <PNAME>Po_3</PNAME>");
            xmlData.append("    <CUSTNAME>lion</CUSTNAME>");
            xmlData.append("    <SHIPADDR>");
            xmlData.append("        <STREET>1033, Main Street</STREET>");
            xmlData.append("        <CITY>Seoul</CITY>");
            xmlData.append("        <STATE>CA</STATE>");
            xmlData.append("   </SHIPADDR>");
            xmlData.append("</PO>");
 
            // PONO elements의 값이 1인 데이타를 수정
            sql.append(" UPDATE po_xml_tab x ");
            sql.append(" SET x.poDoc = sys.XMLType.createXML(?) ");
            sql.append(" WHERE x.poDoc.extract('/PO/PONO/text()').getNumberVal()=1 ");

            ostmt =   (OraclePreparedStatement)conn.prepareStatement(sql.toString());
            ostmt.setString(1, xmlData.toString());

            result = ostmt.executeUpdate();
 
          } catch(SQLException sqlexp){
            sqlexp.printStackTrace();
        } catch(Exception exp){
            exp.printStackTrace();
        }finally {
            try {
                if (ostmt != null)
                    ostmt.close();
            } catch (SQLException se) {
            }
        }
        return result;
    }
   
 

 

    /**
     * XDK API를 이용한 XMLType insert 예제 <BR/>
     * xdb.jar, xmlparserv2.jar,  nls_charset12.jar를 CLASSPATH에 추가해야 합니다.<BR/>
     * xdb.jar :
http://www.oracle.com/technology/tech/xml/xdk/software/prod/xdk_java.html <BR/>
     *
     * @param conn
     * @return insert된 record count
     */
    private int insertXDBXML(Connection conn) {

        int result = -1;

        StringBuffer sql = new StringBuffer();
        StringBuffer xmlData = new StringBuffer();
        OraclePreparedStatement ostmt = null;

        try{
           
            //저장될 샘플 XML Data
            xmlData.append("<PO>");
            xmlData.append("    <PONO>1</PONO>");
            xmlData.append("    <PNAME>Po_1</PNAME>");
            xmlData.append("    <CUSTNAME>John</CUSTNAME>");
            xmlData.append("    <SHIPADDR>");
            xmlData.append("        <STREET>1033, Main Street</STREET>");
            xmlData.append("        <CITY>Sunnyvalue</CITY>");
            xmlData.append("        <STATE>CA</STATE>");
            xmlData.append("   </SHIPADDR>");
            xmlData.append("</PO>");

            // INSERT 문장
            sql.append(" INSERT INTO po_xml_tab (poid, poDoc) ");
            sql.append(" VALUES (po_xml_tab_seq.NEXTVAL, ?) ");
                       
            ostmt =   (OraclePreparedStatement)conn.prepareStatement(sql.toString());

            // XMLType API를 이용          
            XMLType poXML = XMLType.createXML(conn, xmlData.toString());
 
            ostmt.setObject(1, poXML);
 
            result = ostmt.executeUpdate();
 
          } catch(SQLException sqlexp){
            sqlexp.printStackTrace();
        } catch(Exception exp){
            exp.printStackTrace();
        }finally {
            try {
                if (ostmt != null)
                    ostmt.close();
            } catch (SQLException se) {
            }
        }
        return result;
    }
 
 


    /**
     * java test.XMLTypeTest  INSERT
     */
    public static void main(String[] args){

        XMLTypeTest test = new XMLTypeTest();
        Connection conn = null;

        try{

            DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());           
            conn = DriverManager.getConnection ("jdbc:oracle:thin:@127.0.0.1:1521:ORA9I", "scott", "tiger");

            if(args[0] != null && "INSERT".equals(args[0])){

                int result = test.insertXML(conn);
                log(result+" 개의 행이 INSERT 되었습니다.!!");

            }else if(args[0] != null && "XDKINSERT".equals(args[0])){

                int result = test.insertXDBXML(conn);
                log(result+" 개의 행이 INSERT 되었습니다.!!");

            }else if(args[0] != null && "SELECT".equals(args[0])){

                String result = test.selectXML(conn);
                log(" 조회결과 :  "+result);

            }else if(args[0] != null && "UPDATE".equals(args[0])){

                int result = test.updateXML(conn);
                log(result+" 개의 행이 UPDATE 되었습니다.!!");

            } else{
                log("test.XMLTypeTest argument ");
                log("argument : INSERT or XDKINSERT or SELECT or UPDATE ");
            }

        }catch(SQLException sqle){
            sqle.printStackTrace();
        }finally {
            try {
                if (conn != null)
                    conn.close();
            } catch (SQLException se) {
            }          
        } 
    }
   
 
    private static void log(String msg){
        System.out.println(msg);  
    }
   
}