今天在調試Oracle存儲過程中,發現了一個常見的SQL錯誤:無法使用從遠程表定位的lob定位器,相信很多人也經常會遇到這個問題,這個問題歸根結底實際上是Oracle做跨庫連接時遠程表存在像blob、clob等大數據類型的字段,數據庫無法直接在DML操作中運用。現在我將問題和解決思路和網友們分享一下,如果有更好的解決方案,還請指教,謝謝!
1、異常
其中,遠程表so_mstr中存在大數據字段
這時候無法直接通過select語句跨庫取到值,因此就會報出這個錯誤,現在由於我不需要這個字段的值,因此,我的處理方式是跳過這個字段,將其他需要的字段放在子查詢中,
以回避這個字段。
insert into som_mstr --SOM_BF_SO_TERMS,SOM_AF_SO_TERMS (SOM_SO_NBR, SOM_SO_REV, SOM_BF_SO_ADDR, SOM_BF_SO_PO, SOM_BF_SO_CR_TERMS, SOM_BF_SO_SLSPSN, SOM_BF_SO_CURR, SOM_BF_SO_EX_RATE, SOM_BF_SO_VAT, SOM_BF_SO_REV, SOM_BF_SO_RMKS, SOM_BF_SO_CHAR1, SOM_BF_SO_CHAR2, SOM_BF_SO_CHAR3, SOM_BF_SO_CHAR4, SOM_BF_SO_CHAR5, SOM_BF_SO_CHAR6, SOM_BF_SO_QTY1, SOM_BF_SO_QTY2, SOM_PROG_CODE,SOM_AF_SO_ADDR, SOM_AF_SO_PO, SOM_AF_SO_CR_TERMS, SOM_AF_SO_SLSPSN, SOM_AF_SO_CURR, SOM_AF_SO_EX_RATE, SOM_AF_SO_VAT, SOM_AF_SO_RMKS, SOM_AF_SO_CHAR1, SOM_AF_SO_CHAR2, SOM_AF_SO_CHAR3, SOM_AF_SO_CHAR4, SOM_AF_SO_CHAR5, SOM_AF_SO_CHAR6, SOM_AF_SO_QTY1, SOM_AF_SO_QTY2, SOM_RMKS, SOM_WF_STATUS, SOM_SITE,SOM_CRT_BY, SOM_CRT_DATE,SOM_MOD_TIMES,SOM_MOD_BY,SOM_MOD_DATE) SELECT SO_NBR, NVL(SO_REV,1), SO_ADDR, SO_PO, SO_CR_TERMS, SO_SLSPSN, SO_CURR, SO_EX_RATE, SO_VAT, SO_REV, SO_RMKS, SO_CHAR1, SO_CHAR2, SO_CHAR3, SO_CHAR4, SO_CHAR5, SO_CHAR6, SO_QTY1, SO_QTY2, 'SLCHMTA1',SO_ADDR, SO_PO, SOM_AF_SO_CR_TERMS, SO_SLSPSN, SO_CURR, SO_EX_RATE, SO_VAT, SO_RMKS, SO_CHAR1, SO_CHAR2, SO_CHAR3, SO_CHAR4, SO_CHAR5, SO_CHAR6, SO_QTY1, SO_QTY2,SO_RMKS,SO_WF_STATUS,SO_SITE,var_user, sysdate, 0, var_user, sysdate FROM (select SO_NBR, NVL(SO_REV,1), SO_ADDR, SO_PO, SO_CR_TERMS, SO_SLSPSN, SO_CURR, SO_EX_RATE, SO_VAT, SO_REV, SO_RMKS, SO_CHAR1, SO_CHAR2, SO_CHAR3, SO_CHAR4, SO_CHAR5, SO_CHAR6, SO_QTY1, SO_QTY2 ,SO_WF_STATUS,SO_SITE from SO_MSTR) LEFT JOIN SOM_MSTR ON 'F'||SOM_SO_NBR = SO_NBR WHERE SO_NBR = var_nbr AND (SO_REV = var_version or SO_REV is null);
顯然,這種方式只能治標但不能治本,若要治本,還應學習掌握blob、clob大數據類型遠程賦值的技巧,方能在以后的工作中得心應手。