java - 从存储过程调用流式传输 blob 数据

标签 java spring oracle

我正在尝试流式传输从存储过程调用返回的 blob。我正在尝试使用 springs AbstractLobStreamingResultSetExtractor 来执行此操作。

public OutputStream getDocument(final Document doc, final OutputStream outStream) { 

    SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(rdcJdbcTemplate)
    .withProcedureName(PROC_NAME)
    .withCatalogName(CATALOG_NAME)
    .withSchemaName(SCHEMA_NAME).declareParameters(new SqlParameter(DOC_ID_PARAM, OracleTypes.VARCHAR),
            new SqlOutParameter(OUT_PARAM, OracleTypes.BLOB , new AbstractLobStreamingResultSetExtractor<Object>(){

                @Override
                protected void streamData(ResultSet rs) throws SQLException,
                        IOException, DataAccessException {

                    InputStream blobStream = lobHandler.getBlobAsBinaryStream(rs, 1);               
                    if (blobStream != null){                    
                        FileCopyUtils.copy(blobStream, outStream);  
                    }       
                }
            }));

    SqlParameterSource in = new MapSqlParameterSource().addValue(DOC_ID_PARAM, doc.getId());

    Map<String,Object> out = simpleJdbcCall.execute(in);
    return outStream;
}

当我调试这个时,流数据代码永远不会被调用。

我有什么想法可以实现这个吗?

最佳答案

为了 future 的读者,我找到了解决方案

public OutputStream getGlasDocument(final Document doc, final OutputStream outStream) {             

    SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(rdcJdbcTemplate)
    .withProcedureName(PROC_NAME)
    .withCatalogName(CATALOG_NAME)
    .withSchemaName(SCHEMA_NAME).declareParameters(new SqlParameter(DOC_ID_PARAM, OracleTypes.VARCHAR),
            new SqlOutParameter(OUT_PARAM, OracleTypes.BLOB, null, new SqlReturnType() {

                @Override
                public Object getTypeValue(CallableStatement cs, int paramIndex,
                        int sqlType, String typeName) throws SQLException {
                    try {
                        Blob blob = cs.getBlob(1);
                        if (blob != null){
                            FileCopyUtils.copy(cs.getBlob(1).getBinaryStream(), outStream);
                        }                           
                    } catch (IOException e) {                           
                        logger.debug(e.getMessage());
                    }
                    return null;
                }
            }));

    SqlParameterSource in = new MapSqlParameterSource().addValue(DOC_ID_PARAM, doc.getId());        
    simpleJdbcCall.execute(in);
    return outStream;
}

关于java - 从存储过程调用流式传输 blob 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39143000/

相关文章:

sql - 将列更改为非空时避免 ORA-00054

java - Hibernate、Oracle、Join Tables 和关键问题

java - 当 header 看起来正确时,为什么 Springframework 返回空主体?

java - Mp3 播放器 JavaFX

java - 如何在 java ArrayList<Long> 中进行二进制搜索?

java - Android 11 上的沉浸式全屏

java - 使用 @EnableWebMvc 和 WebMvcConfigurerAdapter 进行静态资源定位的 Spring MVC 配置导致 "forward:"和 "redirect:"出现问题

java - Spring+Hibernate集成: Transaction Manager doesn't work using @Transactional

python - 使用 cx_oracle 在 Python 2.7 上执行具有多个查询的 SQL 文件

java - 互相关 : Android AudioRecord create sample data for TDoA