Obtener el valor TEXTO de un OID CLOB en Postgresql

8

Tengo una tabla de base de datos que se parece a:

crear respuestas de tabla (
   id int no nulo,
   question_id int no es nulo,
   texto de respuesta nulo
)

Hibernate creó originalmente esta tabla utilizando el atributo @Lob para la columna "respuesta". No me di cuenta en ese momento, pero cuando se configura de esa manera, Hibernate almacena un OID en la columna en lugar del texto real. Todo funciona bien cuando uso Hibernate para recuperar los valores, ya que convierte automáticamente el OID en la cadena CLOB, sin embargo, se está convirtiendo en un problema de rendimiento y me gustaría deshacerme del OID.

seleccione * de las respuestas
ID PREGUNTA_ID RESPUESTA
===============================
1 123 55123
2 234 51614
3 345 56127
debiera ser
ID PREGUNTA_ID RESPUESTA
===============================
1 123 macho
2 234 203-555-1212
3345555 Main St. Nueva York, NY

Mi deseo es agregar una columna adicional a la tabla "ANSWER_VALUE TEXT" y hacer algo como a continuación para obtener el valor real en la tabla, luego cambiar Hibernate para no usar el designador @Lob

las respuestas de actualización establecen ANSWER_VALUE = getValueFromOID (ANSWER)

¿Existe esa función "getValueFromOID"? Si no es así, ¿podría obtener algunos consejos sobre cómo crear uno o al menos cómo obtener el valor real de un OID?

Gracias

John P
fuente

Respuestas:

10

Gracias a a_horse_with_no_name . La solución es:

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

Nota: la lo_getfunción parece estar presente en Postgres 9.4 o superior. Para versiones anteriores, no veo una forma de hacerlo directamente. Actualmente estoy ejecutando 9.0, pero esto solo aceleró mis planes de actualización.

John P
fuente
¿Lo intentaste loread()? postgresql.org/docs/9.0/static/lo-funcs.html
a_horse_with_no_name
Loread no parece estar disponible para mí como postgres o como propietario de la base de datos. "Ninguna función coincide con el nombre de pila y los tipos de argumento"
John P
Quizás es porque el nombre correcto de la función es lo_read.
Andriy M
La documentación para lo_get está aquí: postgresql.org/docs/9.6/static/lo-funcs.html
Freiheit