Obtenir la valeur TEXT d'un OID CLOB dans Postgresql


8

J'ai une table de base de données qui ressemble à:

créer des réponses de table (
   id int non null,
   question_id int non null,
   texte de réponse nul
)

Ce tableau a été initialement créé par Hibernate en utilisant l'attribut @Lob pour la colonne "réponse". Je ne m'en rendais pas compte à l'époque, mais lors de la configuration de cette façon, Hibernate stocke un OID dans la colonne au lieu du texte réel. Tout fonctionne correctement lorsque j'utilise Hibernate pour récupérer les valeurs car il convertit automatiquement l'OID en chaîne CLOB, mais cela devient un problème de performances et j'aimerais me débarrasser de l'OID.

sélectionner * parmi les réponses
ID QUESTION_ID ANSWER
===============================
1 123 55123
2 234 51614
3 345 56127
devrait être
ID QUESTION_ID ANSWER
===============================
1123 Masculin
2 234 203-555-1212
3 345 555 Main St. New York, NY

Mon souhait est d'ajouter une colonne supplémentaire à la table "ANSWER_VALUE TEXT" et de faire quelque chose comme ci-dessous pour obtenir la valeur réelle dans la table, puis changer Hibernate pour ne pas utiliser l'indicateur @Lob

mettre à jour les réponses définies ANSWER_VALUE = getValueFromOID (ANSWER)

Cette fonction "getValueFromOID" existe-t-elle? Sinon, pourrais-je obtenir des conseils sur la façon d'en créer un ou du moins sur la façon de récupérer la valeur réelle d'un OID?

Merci

Réponses:


10

Merci à a_horse_with_no_name . La solution est:

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

Remarque - la lo_getfonction semble être présente dans Postgres 9.4 ou supérieur. Pour les versions antérieures, je ne vois pas de moyen de le faire directement. J'utilise actuellement la version 9.0, mais cela n'a fait qu'accélérer mes plans de mise à niveau.



loread ne semble pas être disponible pour moi en tant que postgres ou propriétaire de la base de données. "Aucune fonction ne correspond au nom et aux types d'arguments donnés"
John P

C'est peut-être parce que le nom de fonction correct est lo_read.
Andriy M

La documentation de lo_get est ici: postgresql.org/docs/9.6/static/lo-funcs.html
Freiheit
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.