Oracle DBLink中CLOB報錯ORA-22992

巡完南山巡南山發表於2019-01-22

DBLink 中,對於普通欄位按常規方法查詢即可,但是對於 CLOB 欄位的處理相對比較麻煩, CLOB 為大欄位,通常 VARCHAR 最大隻支援到 4000 字元。在按常規方法查詢時會有以下結果:

SELECT MODE_CODE,TRANSFORM_CHANGE_CONTENT from TABLE@ ,其中 “TRANSFORM_CHANGE_CONTENT” CLOB 欄位,會報 “ORA-22992: cannot use LOB locators selected from remote tables” 的錯誤。

常規的處理方法有以下兩種:

1.      採用臨時表方式實現對 LOB 欄位的選取:
建立一個臨時表 “create global temporary table TMP_TB(
MODE_CODE VARCHAR2(16),
TRANSFORM_CHANGE_CONTENT CLOB
)on commit delete rows;”

再執行 “INSERT INTO TMP_TB SELECT MODE_CODE,TRANSFORM_CHANGE_CONTENT from TABLE@ DBLINK;” 後,臨時表中就將對應的資料選取過來了,最後再透過執行 “SELECT * from TMP_TB;” ,即可檢視到結構。

2.      採用將 CLOB 轉換為 VARCHAR 的方式實現:
首先需要用到函式 “dbms_lob.substr( clob_column, for_how_many_bytes, from_which_byte );”
透過建立如下檢視:
CREATE OR REPLACE VIEW DBLINK_V AS
  SELECT MODE_CODE, dbms_lob.substr(TRANSFORM_CHANGE_CONTENT,4000,1) TRANSFORM_CHANGE_CONTENT
    FROM TABLE
透過執行 “SELECT MODE_CODE,TRANSFORM_CHANGE_CONTENT from DBLINK_V @DBLINK;” ,即可實現檢視到結果

結論,方法 1 中也可以使用普通表,但使用的臨時表效率要高於普通表,這裡不做過多討論;方法 2 中建立檢視的效率要遠高於方法 1 ,時間上看方法 1 大於方法 2 的幾倍左右。

注:本文是多年前留存的,忘記是哪轉載或者測試的了,如有侵權請聯絡我刪除。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26964624/viewspace-2564405/,如需轉載,請註明出處,否則將追究法律責任。

相關文章