使用 Apache Camel Framework 将数据持久化为 Oracle DB 中的 BLOB / CLOB 数据类型
Persist data into BLOB / CLOB datatype in Oracle DB using Apache Camel Framework
需要使用 Apache Camel 框架将数据 (XML) 存储为 BLOB 数据类型。
执行正常查询没问题。但是当我试图将数据保存到 BLOB 中时,oracle DB 需要一个兼容的类型。
我在尝试将原始数据转换为 BLOB 兼容类型时尝试使用 utl_raw.cast_to_raw。
这适用于较小的数据,但当数据很大时,如大型请求 XML 超过 2048 个字符,错误 SQL 错误:ORA-06502: PL/SQL: 数字或值错误:原始变量长度太长 被抛出。
有人可以帮助我知道如何使用 Apache Camel 将超过 2048 个字符的数据存储在 BLOB 数据类型中吗?
非常感谢任何帮助。
这是一个使用 HSQLDB 测试时运行良好的示例(我没有方便测试的 Oracle 数据库,但它应该可以正常运行):
// This is just to have some relatively large ammount of data to insert in the BLOB, details don't matter
private static final byte[] LARGE_DATA.getBytes(StandardCharsets.UTF_8);
static {
final StringBuilder builder = new StringBuilder(10000);
for (int i = 0; i < 4000; i++) {
builder.append('a');
}
LARGE_STRING = builder.toString();
}
from("direct:clobTest")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader("myParam", LARGE_DATA);
}
})
.to("sql:INSERT INTO clob_table(clob_col) VALUES(:#myParam)");
或者,它也适用于输入流而不是字节数组:
final InputStream is = new ByteArrayInputStream(LARGE_DATA);
exchange.getIn().setHeader("myParam", is);
需要使用 Apache Camel 框架将数据 (XML) 存储为 BLOB 数据类型。 执行正常查询没问题。但是当我试图将数据保存到 BLOB 中时,oracle DB 需要一个兼容的类型。 我在尝试将原始数据转换为 BLOB 兼容类型时尝试使用 utl_raw.cast_to_raw。
这适用于较小的数据,但当数据很大时,如大型请求 XML 超过 2048 个字符,错误 SQL 错误:ORA-06502: PL/SQL: 数字或值错误:原始变量长度太长 被抛出。
有人可以帮助我知道如何使用 Apache Camel 将超过 2048 个字符的数据存储在 BLOB 数据类型中吗?
非常感谢任何帮助。
这是一个使用 HSQLDB 测试时运行良好的示例(我没有方便测试的 Oracle 数据库,但它应该可以正常运行):
// This is just to have some relatively large ammount of data to insert in the BLOB, details don't matter
private static final byte[] LARGE_DATA.getBytes(StandardCharsets.UTF_8);
static {
final StringBuilder builder = new StringBuilder(10000);
for (int i = 0; i < 4000; i++) {
builder.append('a');
}
LARGE_STRING = builder.toString();
}
from("direct:clobTest")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader("myParam", LARGE_DATA);
}
})
.to("sql:INSERT INTO clob_table(clob_col) VALUES(:#myParam)");
或者,它也适用于输入流而不是字节数组:
final InputStream is = new ByteArrayInputStream(LARGE_DATA);
exchange.getIn().setHeader("myParam", is);