Oracle Database TIP
XMLType Insert, Update, Select JDBC 예제 4 0 14,365

by 김정식 GETSTRINGVAL() GETCLOBVAL() XMLTYPE CREATEXML [2005.11.06]


  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;   

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

 

 
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 예제입니다.
     * @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 예제
     *
     * @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 예제
     * @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 예제
     * xdb.jar, xmlparserv2.jar,  nls_charset12.jar를 CLASSPATH에 추가해야 합니다.
     * xdb.jar : http://www.oracle.com/technology/tech/xml/xdk/software/prod/xdk_java.html 
     * 
     * @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);   
    }
    
}
  
    

- 강좌 URL : http://www.gurubee.net/lecture/1872

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입