在Postgresql中获取CLOB OID的TEXT值

我有一个数据库表,看起来像这样:
create table answers(
   id int not null,
   question_id int not null,
   answer text null
)
这个表最初是由Hibernate使用@Lob属性构建的,用于"answer"列。当时我没有意识到,但是以这种方式设置时,Hibernate会在列中存储一个OID而不是实际文本。当我使用Hibernate检索值时,一切都正常,因为它会自动将OID转换为CLOB字符串,但是这成为了性能问题,我想摆脱OID。
select * from answers
ID     QUESTION_ID     ANSWER
===============================
1       123             55123
2       234             51614
3       345             56127
应该是
ID     QUESTION_ID     ANSWER
===============================
1       123             男性
2       234             203-555-1212
3       345             纽约市,555号主街

我的愿望是在表"ANSWER_VALUE TEXT"中添加一个额外的列,并执行以下操作将实际值放入表中,然后修改Hibernate以不使用@Lob标识符。
update answers set ANSWER_VALUE= getValueFromOID(ANSWER)
那个“getValueFromOID”函数存在吗?如果不存在,我能得到一些关于如何创建一个或者至少如何获取OID的实际值的指导吗? 谢谢。
2个回答

感谢a_horse_with_no_name的贡献。解决方案如下:
update answers set answer_value = lo_get(cast(value as bigint))
注意 - 在Postgres 9.4或更高版本中似乎存在lo_get函数。对于早期版本,我没有找到直接执行此操作的方法。我目前正在运行9.0版本,但这加速了我的升级计划。

你试过loread()了吗?http://www.postgresql.org/docs/9.0/static/lo-funcs.html - user1822
看起来对我来说,无论是作为Postgres还是数据库所有者,loread都不可用。"没有与给定名称和参数类型匹配的函数"。 - John P
可能是因为正确的函数名是lo_read - Andriy M
lo_get的文档在这里:https://www.postgresql.org/docs/9.6/static/lo-funcs.html - Freiheit
我使用了一个稍微修改过的版本:update answers set answer_value = convert_from(lo_get(cast(value as bigint)), 'UTF8') - marioosh

查询:SELECT encode(lo_get([OID], [offset], [length]), 'escape'); 您可以获取特定OID处的实际数据,然后执行更新查询。 例如,
temp_table => SELECT encode(lo_get(238026, 0, 10), 'escape');
 encode 
--------
 world
(1 row)