下面提到的表格是:
CREATE TABLE TABLE
(
ID_DEMAND NUMBER NOT NULL ,
FILE_BLOB BLOB
) ;
ID_DEMAND FILE_BLOB
---------------------
12 (null)
我正在尝试使用以下过程更新Oracle DB中的“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参数的错误Unknown column type
。我试图编辑我的程序和我的代码只使用INTEGER参数,它起作用。
编辑:我最终使用了CallableStatement,因为显然没有其他方法可以实现我想要的。
答案 0 :(得分:0)
为我工作
@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);
}
..
}