java - 如何在 Oracle 中使用 Blob 对象作为 MapSqlParameterSource 的参数

标签 java sql spring oracle blob

下面提到的表格:

CREATE TABLE TABLE
(
   ID_DEMAND             NUMBER NOT NULL ,
   FILE_BLOB BLOB
) ;

ID_DEMAND   FILE_BLOB
---------------------
12          (null)      

我正在尝试使用以下过程更新 Oracle 数据库中的“BLOB”字段:

create or replace FUNCTION UPDATE_BLOB(
  P_ID_DEMAND IN TABLE.ID_DEMAND%TYPE,
  P_FILE_BLOB IN TABLE.FILE_BLOB%TYPE
)return number
IS

BEGIN

  UPDATE TABLE
  SET FILE_BLOB = P_FILE_BLOB
  WHERE ID_DEMAND = P_ID_DEMAND;


  return 1;
  EXCEPTION
    WHEN OTHERS THEN
     return 0;

END UPDATE_BLOB;

首先,我正在读取这样的文件:

int idDemand = 12;
File file = new File("C:\\file.xls");
FileInputStream fileInput = new FileInputStream(file);
byte[] bytes = IOUtils.toByteArray(fileInput);

接下来,我准备参数:

Blob blob = new SerialBlob(bytes);
final Map<String, Object> params = new HashMap<String, Object>();
params.put("P_ID_DEMAND", idDemand);        
params.put("P_FILE_BLOB", blob);

使用 simpleJdbcTemplate (来自 spring)执行该过程后:

final BigDecimal li = callFunction("UPDATE_BLOB",BigDecimal.class, params, SOURCE.BASE);

callFunction的定义:

public static BigDecimal callFunction(String functionName,Map <String, Object> parameters, Source datasource) throws Exception{
Compteur compteur = new Compteur();
compteur.start();
final SimpleJdbcCall simpleJdbcTemplate = new SimpleJdbcCall(DataSourceHelper.getDataSource(datasource));
configureTemplateForFunction(functionName, simpleJdbcTemplate);
final MapSqlParameterSource in = new MapSqlParameterSource().addValues(parameters); 
if (log.isInfoEnabled()) {
    infoFunction(functionName, parameters);
}   
FutureTask<BigDecimal> future =
    new FutureTask<BigDecimal>(new Callable<BigDecimal>() {
    public BigDecimal call() {
        return simpleJdbcTemplate.executeFunction(BigDecimal.class,in);
    }});
executor.execute(future);

BigDecimal out = future.get(TIMEOUT_MAX_IN_SECONDES, TimeUnit.SECONDS);
compteur.stop();

if (log.isInfoEnabled()){
    log.info("Execute : " + functionName + " -- duration --> " + compteur.getTime());
}
return out;
}

我收到 BLOB 参数的错误未知列类型。我尝试编辑我的过程和代码以仅使用 INTEGER 参数,并且它有效。

编辑:我最终使用了 CallableStatement,因为显然没有其他方法可以实现我想要的功能。

最佳答案

为我工作

    @Autowired
    private DataSource ds;

    @Test
    public void testLeePdfs()
    {

        SimpleJdbcCall mySimpleJdbcCall = new SimpleJdbcCall(ds)
                .withSchemaName("MYSCHEME")
                .withCatalogName("MYPACKAGE")
                .withProcedureName("MYSTOREWITHBLOB")
                .declareParameters(new SqlParameter("ParameterWithBlob", Types.BLOB));

        File fileFromDisk = new File("c:\\test.png");

        try( FileInputStream fis = new FileInputStream(fileFromDisk))
        {
            Map<String, Object> map = new HashMap<>();
            map.put( "ParameterWithBlob", new SqlLobValue( fis, (int)fileFromDisk.length()) );
            mySimpleJdbcCall.execute( new MapSqlParameterSource(map));
        }catch( IOException e)
        {
            LOG.error("Fail io operation ", e);
        }
..
}

关于java - 如何在 Oracle 中使用 Blob 对象作为 MapSqlParameterSource 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38303252/

相关文章:

java - Spring 生成的 WSDL 公开了错误的协议(protocol)(HTTP 与 HTTPS)端点位置

java - LinkedMultiValueMap SpringFramework 不迭代(错误 : cannot be cast to class)

java - 谷歌应用引擎: How to "close" an object before second transaction?

java - 使用 JQuery Ajax 将表单提交到 servlet

java - 如何设置我的图形以便用户可以更改大小并保持比例?

sql - 如何在 Postgres sql 函数中引用命名参数?

php - Prestashop Tools::getValue() 函数不逃避 sql 注入(inject)?

java - 即使一切都在Eclipse中运行,我的程序也不会通过命令行编译

mysql - 返回计算值中的两个最高值

Spring 3.2.2 : MockMVC, 返回空结果