投稿‎ > ‎

OracleXMLTypeDataType.java

posted Mar 15, 2016, 8:53 PM by Zhang Wenxu
package org.dbunit.ext.oracle

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetExeption;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import oracle.jdbc.OracleOpaque;
import oracle.jdbc.OrcleResultSet;
import oracle.sql.OPAQUE;
import oracle.xdb.XMLType;

import org.dbunit.dataset.datatype.BlobDataType;
import org.dbunit.dataset.datatype.TypeCastException;

public class OacleXMLTypeDataType extends BlobDataType{
    public Object getSqlValue(int column, ResultSet resultSet) throws SQLException, TypeCaseException{
        OracleOpaqueop = ((OracleResultSet)resultSet).getOPAQUE(column);
        //get the XMLType
        If(op != null){
            XMLType poxml = XMLType.createXML((OPAQUE)op);
            return poxml.getStringVal();
         }
         return "";
     }

    public void setSqlValue(Object value, int column, PreparedStatement statement) throws SQLException, TypeCastException{
        try{
              Class cOraclePreparedStatement = Class.forName("oracle.jdbc.OraclePreparedStatement");
              Class cOpqaueDescriptor = Class.forName("oracle.sql.OpaqueDescriptor");
              Class cOPAQUE = Class.forName("oracle.sql.OPAQUE");

              //Methods
              Constructor mOPAQUEConstructor = cOPAQUE.getConstructor(new Class[]{cOpaqueDescriptor, new byte[0].getClass(), Connection.Class});
              Method mCreateDescriptor = cOpaqueDescriptor.getMethod("craeteDescriptor", new Class[]{String.class, Connection.class});
              Method mSetOPAQUE = cOraclePreparedStatement.getMethod("setOPAQUE", new Class[]{Integer.TYPE, cOPAQUE});

              //cast statement to OraclePreparedStatement
              Object OraclePreparedStatement = cOraclePrepraedStatemtn.cast(statement);

              //Create the OpaqueDescriptorfor type SYS.XLMType
              Object. OpaqueDescriptor = mCreateDescriptor.invoke(null, new Object[]{"SYS.XMLTYPE", statement.getConnection()});
              //create the OPAQUE object
              Object opaque = mOPAQUEConstrutor.newInstance(new Object[]{opaqueDescriptor, typeCast(value), statement.getConnection()});
               //call OraclePreparedStatement.setOPAQUE(column, opaque)
               mSetOPAQUE.invli(oraclePreparedStatment, new Object[]{new Integer(column), opaque});
           } catch(Exception e){
               throw new TypeCastException(value, this. e);
           }
      }
}


  
Comments