Ottieni il valore TEXT di un OID CLOB in Postgresql


8

Ho una tabella di database che assomiglia a:

crea risposte per la tabella (
   id int non null,
   question_id int non null,
   rispondi al testo null
)

Questa tabella è stata originariamente compilata da Hibernate utilizzando l'attributo @Lob per la colonna "answer". Non me ne sono reso conto in quel momento, ma quando impostato in questo modo, Hibernate memorizza un OID nella colonna anziché il testo effettivo. Tutto funziona bene quando uso Hibernate per recuperare i valori poiché converte automaticamente l'OID in stringa CLOB, tuttavia sta diventando un problema di prestazioni e mi piacerebbe eliminare l'OID.

seleziona * dalle risposte
ID QUESTION_ID RISPOSTA
===============================
1 123 55123
2 234 51614
3 345 56127
dovrebbe essere
ID QUESTION_ID RISPOSTA
===============================
1 123 maschi
2 234 203-555-1212
3 345 555 Main St. New York, NY

Il mio desiderio è quello di aggiungere una colonna aggiuntiva alla tabella "ANSWER_VALUE TEXT" e fare qualcosa come sotto per ottenere il valore effettivo nella tabella, quindi cambiare Hibernate in giro per non usare il designatore @Lob

aggiorna risposte set ANSWER_VALUE = getValueFromOID (ANSWER)

Esiste quella funzione "getValueFromOID"? In caso contrario, potrei ottenere alcuni suggerimenti su come creare uno o almeno come recuperare il valore effettivo di un OID?

Grazie

Risposte:


10

Grazie va a a_horse_with_no_name . La soluzione è:

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

Nota: la lo_getfunzione sembra essere presente in Postgres 9.4 o versioni successive. Per le versioni precedenti, non vedo un modo per farlo direttamente. Attualmente sto eseguendo 9.0, ma questo ha appena accelerato i miei piani di aggiornamento.



loread non sembra essere disponibile per me come postgres o come proprietario del database. "Nessuna funzione corrisponde al nome e ai tipi di argomenti indicati"
John P

Forse è perché il nome della funzione corretta è lo_read.
Andriy M,

La documentazione per lo_get è qui: postgresql.org/docs/9.6/static/lo-funcs.html
Freiheit
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.