相当于H2中Oracle的empty_blob()

问题描述 投票:0回答:1

我有一个使用 Oracle 的普通 Java 应用程序(没有 Spring Boot 或类似的东西),但我需要将其迁移到使用嵌入式 H2 实例(这样它就可以部署在开发服务器上,而不需要 Oracle站起来)。我已经将 H2 设置为 Oracle 兼容模式,而且我几乎完全做到了这一点,但我遇到了 BLOB 问题。

简单来说,应用程序代码在表中创建一条记录:

insert into my_table (my_field) values (empty_blob())

然后,它执行此查询:

select my_field from my_table

然后,它对该查询返回的 BLOB(java.sql.Blob 对象)调用 setBytes(),然后执行以下操作:

update my_table set my_field=? where id=123

?当然,这是通过准备好的语句插入的数据的字节。

现在,让我们先把它为什么要采用这种多阶段方式放在一边……它是一个较旧的应用程序,更改代码并不是真正的选择……但无论如何,在 Oracle 中,这都可以完美地工作。但在 H2 中,无论我尝试什么,我似乎总是得到 Blob 对象为 null,因此在调用 setBytes() 时会发生 NullPointerException。

我在插入语句中尝试了几种方法来获取非空值:

CAST('' AS BLOB)
BLOB ''
X''
RAXTOHEX('')
''

我还明确尝试设置 null 值,我知道这是行不通的,但只是为了完整性而说明它。

在所有情况下,我仍然达到了 NPE。我似乎无法像在 Oracle 中那样在 H2 中插入空的 BLOB,这是问题的症结所在。

好吧,不是所有情况:事实证明,执行 X'' 确实会得到一个空的 BLOB,但是在更新查询时,我收到错误“不支持功能:分配一个新对象来设置其值 [50100-224” ]“...这看起来更接近,但现在我不确定如何在不更改代码的情况下解决这个问题。所以也许我最初的问题无论如何都不是正确的(请注意,当我意识到 X'' 的行为与其他问题不同时,我在原始帖子之后添加了这一段,并且我认为 RAWTOHEX() 也是如此).

有人知道我还可以尝试什么吗?谢谢!

blob h2
1个回答
0
投票

好吧,我没有找到我的问题的直接、彻底的答案,但我确实找到了解决方案。

简单地说,虽然我不想触及应用程序代码,但我最终还是做了一个简单的更改。

首先,对于插入语句,我为 BLOB 插入 null。然后,在更新查询之前的代码中,它原来的位置:

final Blob b = rs.getBlob(1);

...我现在做...

Blob b = null;
if (runningInDev) {
  b = conn.createBlob();
} else {
  b = rs.getBlob(1);
}

这对 H2 有用,对 Oracle 也同样有效,而且这是一个足够小的变化,我可以接受。

我仍然很想听听是否有人有办法做到这一点,不需要这种改变,但这让我以最小的麻烦克服了困难,所以我现在就可以开始了。谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.