gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:26:45 33 4
gpt4 key购买 nike

下面提到的表格:

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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com