Postgres:更新TEXT列(CLOB)的值

时间:2018-11-12 12:50:33

标签: postgresql hibernate clob

我有一个TEXT类型的列,该列应该表示一个CLOB值,我正在尝试像这样更新其值:

UPDATE my_table SET my_column = TEXT 'Text value';

通常,此列是由Hibernate编写和读取的,我注意到用Hibernate编写的值存储为整数(也许某些内部Postgres引用了CLOB数据)。

但是当我尝试使用上述SQL更新列时,该值存储为字符串,并且当Hibernate尝试读取它时,出现以下错误:Bad value for type long : ["Text value"]

我尝试了in this answer中描述的所有选项,但结果始终相同。如何使用SQL插入/更新TEXT列?

1 个答案:

答案 0 :(得分:0)

为了更新 Hibernate 创建的 cblob,你应该使用函数来处理大对象:

文档可以在以下链接中找到:

https://www.postgresql.org/docs/current/lo-interfaces.html
https://www.postgresql.org/docs/current/lo-funcs.html

示例:

查询:

num: 39
num: 2
num: 15
num: 74
num: 80
num: 29
num: 14
num: 16
num: 8
num: 11
num: 2
39
2
15
74
80
29
14
16
973747761
909588276
2614

观察:
x'40000'对应读模式(INV_WRITE)

更新:

select maytable.*,  convert_from(loread(lo_open(mycblobfield::int, x'40000'::int), x'40000'::int),  'UTF8') from mytable where mytable.id = 4;

观察:
x'60000' = INV_WRITE + INV_READ 对应读写模式(INV_WRITE + IV_READ)。
数字 16425 是一个示例 loid(大对象 ID),它已经存在于您的表中的记录中。它是您可以在 Hinernate 创建的 blob 字段中看到的整数。

插入:

select lowrite(lo_open(16425, x'60000'::int), convert_to('this an updated text','UTF8'));

观察:
lo_creat(-1) 生成一个新的大对象 a 返回它的 loid