Postgresql
在 Postgresql 中獲取 CLOB OID 的 TEXT 值
我有一個看起來像這樣的數據庫表:
創建表答案( 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)