PostgresqlでCLOB OIDのTEXT値を取得します


8

次のようなデータベーステーブルがあります。

テーブルの回答を作成します(
   id intはnullではありません。
   question_id intはnullではありません、
   回答テキストnull
)

このテーブルは、Hibernateによって「answer」列の@Lob属性を使用して最初に作成されました。そのときは気づきませんでしたが、そのように設定すると、Hibernateは実際のテキストではなくOIDを列に格納します。HIDを使用して値を取得すると、OIDがCLOB文字列に自動的に変換されるため、すべてが正常に機能しますが、パフォーマンスの問題になり、OIDを削除したいと考えています。

回答から選択*
ID QUESTION_ID ANSWER
===============================
1 123 55123
2 234 51614
3 345 56127
する必要があります
ID QUESTION_ID ANSWER
===============================
1 123男性
2 234 203-555-1212
3 345 555 Main St. New York、NY

私の望みは、テーブル「ANSWER_VALUE TEXT」に追加の列を追加し、実際の値をテーブルに取得するために以下のようなことを行い、@ Lob指定子を使用しないようにHibernateを変更することです。

回答の更新セットANSWER_VALUE = getValueFromOID(ANSWER)

その「getValueFromOID」関数は存在しますか?そうでない場合、どのように作成するか、少なくともOIDの実際の値をフェッチする方法について、いくつかの指針を得ることができますか?

ありがとう

回答:


10

a_horse_with_no_nameに感謝します。解決策は:

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

注-このlo_get関数はPostgres 9.4以降に存在するようです。以前のバージョンでは、これを直接行う方法がわかりません。現在9.0を実行していますが、これによりアップグレード計画が加速されました。



loreadは、postgresとしても、データベース所有者としても使用できないようです。「指定された名前と引数の型に一致する関数はありません」
John P

おそらく、正しい関数名がであるためですlo_read
Andriy M

lo_getのドキュメントはこちら:postgresql.org/docs/9.6/static/lo-funcs.html
Freiheit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.