2015-04-22 76 views
-1

我使用Spring 3.2.2,這是我的Java代碼:春參數存儲過程ArrayDescriptor與屬性的blob

@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); 
} 

我有這個在甲骨文:

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

Esto funciono,falta depurar elcódigo。 Lo dejareaquípara a 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(); 
     } 
    } 
} 
+0

請用英文填寫。 –