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);
}
}
'Programming > JAVA' 카테고리의 다른 글
[세련된 자바 웹 프로그래머 되기] ① 기본기 갈고닦기 (0) | 2008.04.28 |
---|---|
java 날짜관련 (0) | 2008.04.28 |
REF CURSOR를 사용해 프로시저에서 여러행을 반환하는 예제 (0) | 2008.04.23 |
Oracle10g 에서 CLOB 데이터타입 JDBC 예제 (0) | 2008.04.23 |
오라클 clob 예제 (0) | 2008.04.17 |