Obter valor TEXT de um CLOB OID no Postgresql

8

Eu tenho uma tabela de banco de dados que se parece com:

criar respostas de tabela (
   id int não nulo,
   question_id int não nulo,
   responder texto nulo
)

Esta tabela foi originalmente criada pelo Hibernate usando o atributo @Lob para a coluna "resposta". Eu não percebi isso na época, mas, quando configurado dessa maneira, o Hibernate armazena um OID na coluna em vez do texto real. Tudo funciona bem quando eu uso o Hibernate para recuperar os valores, pois ele converte automaticamente o OID para a string CLOB, no entanto, está se tornando um problema de desempenho e eu gostaria de me livrar do OID.

selecione * das respostas
ID QUESTION_ID RESPOSTA
===============================
1 123 55123
2 234 51614
3 345 56127
deveria estar
ID QUESTION_ID RESPOSTA
===============================
1 123 Masculino
2 234 203-555-1212
3 345 555 Main St. Nova York, Nova Iorque

Meu desejo é adicionar uma coluna extra à tabela "ANSWER_VALUE TEXT" e fazer algo como abaixo para obter o valor real na tabela e alterar o Hibernate para não usar o designador @Lob

atualizar conjunto de respostas ANSWER_VALUE = getValueFromOID (ANSWER)

Existe a função "getValueFromOID"? Caso contrário, eu poderia obter algumas dicas sobre como criar uma ou pelo menos como buscar o valor real de um OID?

obrigado

John P
fonte

Respostas:

10

Obrigado vai para a_horse_with_no_name . A solução é:

update answers set answer_value = lo_get(cast(value as bigint))

Nota - a lo_getfunção parece estar presente no Postgres 9.4 ou superior. Para versões anteriores, não vejo uma maneira de fazer isso diretamente. Atualmente, estou executando o 9.0, mas isso apenas acelerou meus planos de atualização.

John P
fonte
Você tentou loread()? postgresql.org/docs/9.0/static/lo-funcs.html
a_horse_with_no_name
Loror não parece estar disponível para mim como postgres ou como proprietário do banco de dados. "Nenhuma função corresponde ao nome dado e aos tipos de argumento"
John P
Talvez seja porque o nome correto da função seja lo_read.
Andriy M
A documentação para lo_get está aqui: postgresql.org/docs/9.6/static/lo-funcs.html
Freiheit