用于存储具有属性blob的过程ArrayDescriptor的Spring参数

时间:2015-04-22 17:20:37

标签: java spring oracle blob

我正在使用Spring 3.2.2,这是我的Java代码:

@Override
public void writeSQL(SQLOutput stream) throws SQLException {

    stream.writeInt(this.intIdNdcArchivoAdjunto);
    stream.writeInt(this.objNotaCredito.getIntId());
    stream.writeString(this.strNombreArchivo);
    stream.writeString(this.strFormatoArchivo);
    stream.writeInt(this.objTipoArchivo.getIntIdTipoArchivo());

    oracle.sql.BLOB blob = oracle.sql.BLOB.getEmptyBLOB();
    blob.setBytes(getObjArchivoCargado());

    stream.writeBlob(blob);
}

我在Oracle中有这个:

CREATE OR REPLACE TYPE "TP_OBJ_NDC_ARCHIVO" 
as object(
id_ndc_archivo_adjunto number,
id_ndc number,
nombre_archivo varchar2(50),
formato varchar2(5),
tipo_archivo number,
archivo blob
);

CREATE OR REPLACE TYPE "TP_ARR_NDC_ARCHIVO"
AS TABLE OF TP_OBJ_NDC_ARCHIVO;

我以前用ArrayDescriptor做了几个例子,但是当它包含BLOB类型时我遇到了问题:

org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [{call cadco.PCK_NOTAS_CREDITO.CrearSolicitudNDC(?, ?, ?, ?, ?, ?, ?, ?, ?)}]; SQL state [60000]; error code [600]; ORA-00600: código de error interno, argumentos: [kollasg:client lob on server], [], [], [], [], [], [], [], [], [], [], [] ; nested exception is java.sql.SQLException: ORA-00600: código de error interno, argumentos: [kollasg:client lob on server], [], [], [], [], [], [], [], [], [], [], []

1 个答案:

答案 0 :(得分:0)

Esto funciono,falta depurarelcódigo。 Lodejareaquíparaa quien le sirva。

public void insertAll(NotaCreditoArchivoAdjunto [] arrNotaCreditoArchivoAdjunto) {

    Connection conn=null;
    StructDescriptor structDescriptor=null;
    ArrayDescriptor arrayDescriptor=null;
    int iSize = arrNotaCreditoArchivoAdjunto.length;
    Object[] arrObj =null;
    Object[][] recObj =null;
    try {

    this.jdbcTemplate = new JdbcTemplate(dataSource);

    conn=jdbcTemplate.getDataSource().getConnection();

//         OracleConnection oraConn = conn.unwrap(OracleConnection.class);

    structDescriptor = StructDescriptor.createDescriptor(ORACLE_STRUCT, oraConn.getMetaData().getConnection());
    arrayDescriptor = ArrayDescriptor.createDescriptor(ORACLE_ARRAY, oraConn.getMetaData().getConnection());

    arrObj = new Object[iSize];
    recObj = new Object[iSize][6];

    //Structuring obj and arrays
    for (int j = 0; j < iSize ;j++){

    NotaCreditoArchivoAdjunto ob = arrNotaCreditoArchivoAdjunto[j];
    recObj[j][0]=ob.getIntIdNdcArchivoAdjunto();
    recObj[j][1]=ob.getObjNotaCredito().getIntId();
    recObj[j][2]=ob.getStrNombreArchivo();
    recObj[j][3]=ob.getStrFormatoArchivo();
    recObj[j][4]=ob.getObjTipoArchivo().getIntIdTipoArchivo();

    BLOB blob = BLOB.createTemporary(oraConn,false,BLOB.DURATION_SESSION);
    OutputStream outputStream = blob.setBinaryStream(0L);
    InputStream inputStream = new ByteArrayInputStream(ob.getObjArchivoCargado());
    byte[] buffer = new byte[blob.getBufferSize()];
    int bytesRead = 0;
    while((bytesRead = inputStream.read(buffer)) != -1){
        outputStream.write(buffer,0,bytesRead);
    }
    outputStream.close();
    inputStream.close();

    recObj[j][5]= blob;

    arrObj[j] = new STRUCT(structDescriptor, oraConn.getMetaData().getConnection(), recObj[j]);

    }
    ARRAY arr = new ARRAY(arrayDescriptor, oraConn.getMetaData().getConnection(), recObj);

    PreparedStatement preparedStatement=conn.prepareStatement("{call cadco.PCK_NOTAS_CREDITO.Borrar (?)}");
    preparedStatement.setArray(1, arr);
    preparedStatement.execute();

    }catch (Exception e) {

        e.printStackTrace();
    } finally{
    try {
    if (conn != null){
        conn.close();
        }
    } 
        catch (SQLException e2) {
            e2.printStackTrace();
        }
    }
}