Dapatkan nilai TEKS dari CLOB OID di Postgresql

8

Saya memiliki tabel database yang terlihat seperti:

buat jawaban tabel (
   id int bukan null,
   question_id int bukan null,
   teks jawaban nol
)

Tabel ini awalnya dibuat oleh Hibernate menggunakan atribut @Lob untuk kolom "jawaban". Saya tidak menyadarinya pada saat itu, tetapi ketika mengatur seperti itu, Hibernate menyimpan OID di kolom alih-alih teks yang sebenarnya. Semuanya berfungsi dengan baik ketika saya menggunakan Hibernate untuk mengambil nilai karena secara otomatis mengkonversi OID ke string CLOB, namun itu menjadi masalah kinerja dan saya ingin menyingkirkan OID.

pilih * dari jawaban
ID QUESTION_ID JAWABAN
===============================
1 123 55123
2 234 51614
3 345 56127
seharusnya
ID QUESTION_ID JAWABAN
===============================
1 123 Pria
2 234 203-555-1212
3 345 555 Main St. New York, NY

Keinginan saya adalah menambahkan kolom tambahan ke tabel "ANSWER_VALUE TEXT" dan melakukan sesuatu seperti di bawah ini untuk mendapatkan nilai aktual ke dalam tabel, lalu ubah Hibernasi sekitar untuk tidak menggunakan @Lob designator

perbarui jawaban atur ANSWER_VALUE = getValueFromOID (ANSWER)

Apakah fungsi "getValueFromOID" itu ada? Jika tidak, dapatkah saya mendapatkan beberapa petunjuk tentang cara membuatnya atau setidaknya bagaimana cara mengambil nilai OID yang sebenarnya?

Terima kasih

John P.
sumber

Jawaban:

10

Terima kasih ke a_horse_with_no_name . Solusinya adalah:

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

Catatan - lo_getfungsi ini muncul di Postgres 9.4 atau lebih tinggi. Untuk versi sebelumnya, saya tidak melihat cara melakukan ini secara langsung. Saya sedang menjalankan 9.0, tetapi ini hanya mempercepat rencana upgrade saya.

John P.
sumber
Apakah kamu sudah mencoba loread()? postgresql.org/docs/9.0/static/lo-funcs.html
a_horse_with_no_name
loread tampaknya tidak tersedia bagi saya sebagai postgres, atau pemilik basis data. "Tidak ada fungsi yang cocok dengan nama dan tipe argumen yang diberikan"
John P
Mungkin itu karena nama fungsi yang benar lo_read.
Andriy M
Dokumentasi untuk lo_get ada di sini: postgresql.org/docs/9.6/static/lo-funcs.html
Freiheit