我正在使用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], [], [], [], [], [], [], [], [], [], [], []
答案 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();
}
}
}