我有一个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列?
答案 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