Postgresql

在 Postgresql 中獲取 CLOB OID 的 TEXT 值

  • January 25, 2022

我有一個看起來像這樣的數據庫表:

創建表答案(
id int 不為空,
question_id int 不為空,
回答文本空
)

該表最初是由 Hibernate 使用“answer”列的 @Lob 屬性建構的。我當時並沒有意識到,但是當以這種方式設置時,Hibernate 在列中儲存了一個 OID 而不是實際的文本。當我使用 Hibernate 檢索值時一切正常,因為它會自動將 OID 轉換為 CLOB 字元串,但是它正在成為一個性能問題,我想擺脫 OID。

從答案中選擇 *
ID QUESTION_ID 答案
===============================
1 123 55123
2 234 51614
3 345 56127
應該
ID QUESTION_ID 答案
===============================
1 123 男
2 234 203-555-1212
3 345 555 Main St. 紐約州紐約市

我的願望是在表“ANSWER_VALUE TEXT”中添加一個額外的列,並執行如下操作以將實際值放入表中,然後將 Hibernate 更改為不使用 @Lob 指示符

更新答案集 ANSWER_VALUE= getValueFromOID(ANSWER)

那個“getValueFromOID”函式存在嗎?如果沒有,我能否得到一些關於如何創建一個或至少如何獲取 OID 的實際值的指針?

謝謝

感謝a_horse_with_no_name。解決方案是:

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

注意 - 該lo_get功能似乎存在於 Postgres 9.4 或更高版本中。對於早期版本,我看不到直接執行此操作的方法。我目前正在執行 9.0,但這只是加快了我的升級計劃。

詢問 :SELECT encode(lo_get([OID], [offset], [length]), 'escape');

您可以獲取特定 OID 處的實際數據,然後執行更新查詢。例如,

temp_table => SELECT encode(lo_get(238026, 0, 10), 'escape');
encode 
--------
world
(1 row)

引用自:https://dba.stackexchange.com/questions/90857