Insert XML to Oracle XMLType

มีงานที่ต้องนำข้อมูลที่อยู่ในรูปแบบ XML ลงไปบันทึกในฐานข้อมูล ของ Oracle ข้อมูลที่จะทำการบันทึก็เป็นแค่ XML ที่อยู่ในรูปแบบของ String ธรรมดาแต่ต้องการเอาไปเก็บเป็นชนิดข้อมูล (Data Type) ที่เป็น XML ของ Oracle จากการหาข้อมูลดูก็ได้ตัวอย่าง Code จาก เว็บ Oracle เลยทดลองเขียนเป็น PL/SQL ดังนี้
สร้างตาราง

CREATE TABLE XML_TEM(
  XML_ID    VARCHAR2(30 BYTE) NOT NULL,
  XML_DESC  VARCHAR2(50 BYTE),
  XML_DATA  SYS.XMLTYPE
);

สร้าง Procedure

CREATE OR REPLACE PROCEDURE INSERT_XML IS
    V_XML       VARCHAR(4000);
    V_ERR_CODE  VARCHAR(100);
    V_ERR_DESC  VARCHAR(1000);

BEGIN
    V_XML := V_XML||'<?xml version="1.0" encoding="UTF-8"?>';
    V_XML := V_XML||'<PROCESS>';
    V_XML := V_XML||'<STATUS>OK</STATUS>';
    V_XML := V_XML||'<DESC>Process transaction success.</DESC>';
    V_XML := V_XML||'</PROCESS>';
   
    INSERT INTO XML_TEM (XML_ID, XML_DESC, XML_DATA) 
    VALUES ('101','Command state',XMLTYPE(V_XML));
   
EXCEPTION
    WHEN OTHERS THEN
        V_ERR_CODE := SQLCODE;
        V_ERR_DESC := SQLERRM;        
END INSERT_XML;
/

ซึ่งไม่มีปัญหาอะไร และ ทดสอบโดยใช้วิธีเดียวกันนี้กับ Code Java ก็ใช้งานได้ดี ดังนี้

private static void insertXML() throws SQLException{
	Connection conn = null;
	PreparedStatement pStmt = null;
	StringBuffer sql = new StringBuffer();
	String xmlData = "<data><no>100</no><name>Name is</name></data>";
	try{
		conn = getConnection();							
		sql.append("INSERT INTO XML_TEM (XML_ID, XML_DESC, XML_DATA)");
		sql.append(" VALUES (?,?,XMLTYPE(?))");
				
		pStmt = conn.prepareStatement(sql.toString());
		pStmt.setString(1, "101");
		pStmt.setString(2, "XML Information support data");
		pStmt.setString(3, xmlData);
		
		pStmt.executeUpdate();
		conn.commit();		
	}catch (SQLException e){
		conn.rollback();
		e.printStackTrace();
	}finally{
		if(pStmt != null) pStmt.close();
		if(conn != null) conn.close();
	}
}

หมายเหตุ : สามารถใช้ได้กับ XML ขนาดสูงสุดที่ 64K เท่านั้น หากมีขนาดมากว่า 64k จะไม่สามารถใช้ได้
อ้างอิง
Loading a large XML Document into the Database

  1. No comments yet.

  1. No trackbacks yet.