谢谢大家的帮助!
我终于找到了解决方法。由于我存储的是字节而不是字符,因此我将使用 BLOB 来存储数据。BLOB 的问题是它不能被索引。另一种方法是使用 RAW 类型的列。它存储字节并且是可索引的。不幸的是它太小了(2000 字节)。因此,在我的情况下,答案在于将数据存储在 BLOB 中,并通过两种 RAW 类型的索引访问它,因为数据永远不会超过 4000 字节。
索引如下所示:
CREATE INDEX blob_to_raw_prd_ix
ON product (product_id,
substr_dt(blob_summary,2000,1),
substr_dt(blob_summary,2000,2001));
在哪里
- blob_summary 是我存储数据的 BLOB 列
substr_dt 是用户定义的确定性函数(定义如下)
创建或替换函数 substr_dt(str BLOB, buffer_size int, offset int) RETURN RAW DETERMINISTIC IS BEGIN RETURN dbms_lob.substr(str,buffer_size,offset); 结尾;
要访问数据,我只需要使用别名查询 product_id 和字段,例如
SELECT /*+ index(blob_to_raw_prd_ix) */ product_id,
substr_dt(blob_summary, 2000, 1) AS summary1,
substr_dt(blob_summary, 2000, 2001) AS summary2
FROM product
WHERE (product_id = ?);
在这种情况下,summary_1 表示 blob 的前 2000 个字节,summary 2 表示最后 2000 个字节。在两个数组summary1 和summary2 上使用串联,我得到了blob 的内容。
这适用于 Jdbc,但我无法使其适用于 Hibernate(还)。这不是最好的解决方案,因为数据在被解释之前需要重新处理。但是,它在没有编码空间开销的情况下解决了数据访问问题。