投稿‎ > ‎

OracleXMLTypeDataType.java

posted Jun 14, 2016, 2:02 AM by Zhang Wenxu
package org.dbunit.ext.oracle;

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

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

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

public class OracleXMLTypeDataType extends BlobDataType{
    public Object getSqlValue(int column, ResultSet resultSet) throws SQLException, TypeCastException{
        OracleOpaque op = ((OracleResult)resultSet).getOPAQUE(column);
        if(op != null){
            XMLType poxml = XMLType.createXML((OPAQUE)op);
            return poxml.getStringVal();
         }
         return "";
    }
    public void setSqlValue(Object value, int column, PerparedStatement statement) throws SQLException, TypeCastException{
        try{
             Class cOraclePreparedStatement = Class.forName("oracle.jdbc.OraclePreparedStatement");
             Class cOpaqueDescrptor = Class.forName("oracle.sql.OpaqueDescriptor");
             Class cOPAQUE = Class.forName("oracle.sql.OPAQUE");
             Constructor mOPAQUEConstructor = cOPAQUE.getConstructor(new Class[]{cOpaqueDescriptor, new byte[0].getClass(), Connection.class});
              Method mCreateDescriptor = cOpaqueDescriptor.getMethod("createDescriptor", new Class[]{String.class, Connection.class});
              Method mSetOPAQUE = cOraclePreparedStatement.getMethod("setOPAQUE", new Class[]{Integer.TYPE, cOPAQUE});
              Object oraclePreparedStatment = cOraclePreparedStatement.cast(statement);
              Object OpaqueDescriptor = mCreateDescriptor.invode(null, new Object[]{"SYS.XMLTYPE", statement.getConnection()});
              Object opaque = mOPAQUEConstructor.newInstance(new Object[]{OpaqueDescriptor, typeCast(value), statement.getConnection()});
              mSetOPAQUE.invoke(OraclePreparedStatement, new Object[]{new Integer(column), opaque});
          }
          catch(Exception e){
              throw new TypeCastException(value, this, e);
         }
    }
}

Comments