OGG複製同步,提示欄位長度不夠ORA-01704

綠茶有點甜發表於2020-08-27

日常運維OGG的環境中,如果遇到複製程式報錯,提示欄位長度不足如何處理???

正常情況下,欄位長度不足,但是未達到Oracle的限制時,可以對欄位進行擴大限制滿足目的。

實際環境中,遇到源端GBK,目標端AL32UTF8,目標端表使用varchar2(4000 char)。

但是還是遇到ORA -01704的問題。

 

一、使用varchar2(4000 char) 能儲存4000個漢字嗎???

如下測試驗證說明,實際上Oracle還是受到varchar2 4000 bytes的限制,一個漢字佔用3位元組。    

這裡說明下varchar2(xx char) 這個假設是20限制,說明這個列最大允許儲存20個字元,如果都是漢字,實際上max 限制是=60 bytes 及預設情況下的varchar2(60).

SQL> desc c
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 CC_NAME                                            VARCHAR2(4000 CHAR)
insert into c values('');
SQL> select length(cc_name) from c;
SQL> insert into c values('炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起');

LENGTH(CC_NAME)
---------------
              1
            759
SQL> insert into c values('炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起
炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起
');
ORA-01704: string literal too long
加一起1500字元左右就報錯了???  按照4000/3=1333字元

SQL> insert into c values('炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵
參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起
參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠空而炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起
參天古樹縱橫交錯繁茂的樹冠只飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦雲霧間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴飛鳥騰空而起嘶鳴著翱翔於邦東部的池雲雨林雲著翱翔
池雲雨林雲位林雲');
 
==
SQL> insert into c values('炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵
   參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起
  3  參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻
飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠空而炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起
4 參天古樹縱橫交錯繁茂的樹冠只飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴飛鳥騰空而起嘶鳴著翱翔於天際間炎炎夏日位於聯邦雲霧間炎炎夏日位於聯邦東部的池雲雨林雲霧瀰漫好似一層薄紗環繞一棵棵參天古樹縱橫交錯繁茂的樹冠中時而有幾隻飛鳥騰空而起嘶鳴飛鳥騰空而起嘶鳴著翱翔於邦東部的池雲雨林雲著翱翔 5 池雲雨林雲位林雲'); 1 row created. [oracle@test ~]$ echo $NLS_LANG AMERICAN_AMERICA.UTF8 ORA-01704: string literal too long SQL> SQL> select length(cc_name) from c; LENGTH(CC_NAME) --------------- 1329 1333 1 759 879 1244 1276 1336 1334 1336 10 rows selected. ORA-01704: string literal too long 加一起1500字元左右就報錯了??? 按照4000/3=1333字元 SQL> desc c Name Null? Type ----------------------------------------- -------- ---------------------------- CC_NAME VARCHAR2(4000 CHAR)

 

二 、目標端遭遇欄位長度不足的問題如何處理???

1.目標端列型別從varchar2 改造為clob

2.使用OGG 複製程式引數,擷取部分字元,小於oracle 11g varchar2 4000 bytes的限制。

3.源端抽取是否有引數擷取欄位?  想法,有感興趣的兄弟們可以找找資料測試下。

1.目標端列型別從varchar2 改造為clob

source
SQL> desc d1
 STATUS VARCHAR2(10)
SQL> select ID,STATUS from d1;
        ID STATUS
---------- ----------
         6 0
SQL> alter table d1 modify STATUS VARCHAR2(12);
SQL> update d1 set status='123456789012' where id=6;
SQL> commit;
target
GGSCI (t2) 14> info all
REPLICAT    ABENDED     REPA        00:00:00      00:00:35    
GGSCI (t2) 15> view report repa
2020-08-27 14:55:02  ERROR   OGG-01163  Bad column length (12) specified for column STATUS in table YZ.D1, maximum allowable length is 10.

修改欄位型別
alter table d1 rename column status to status_old;
alter table d1 add status clob;
update d1 set status=trim(status_old);
驗證
SQL> select id,status,status_old from d1;
        ID STATUS               STATUS_OLD
---------- -------------------- ----------
         6 0                    0
alter table d1 drop column status_old;

可選
trim函式從字串的開頭或結尾刪除所有指定的字元

SQL> desc d1
 STATUS  CLOB
 
GGSCI (t2) 18> start repa

再次啟動報錯
2020-08-27 15:03:20  ERROR   OGG-01163  Bad column length (12) specified for column STATUS in table YZ.D1, maximum allowable length is 10.
2020-08-27 15:03:20  INFO    OGG-06511  Using following columns in default map by name: ID, CC_NAME, WITTIME, STATUS1, STATUS.
2020-08-27 15:03:20  INFO    OGG-06510  Using the following key columns for target table BAK_YZ.D1: ID, CC_NAME, WITTIME, STATUS1.
GGSCI (t2) 29> view param repa
assumetargetdefs                           
MAP YZ.D1,TARGET BAK_YZ.D1;
https://www.cnblogs.com/weimengjiacan/articles/8462982.html
OGG源端和目標端欄位順序不一致的解決方案
MAP YZ.D1,TARGET BAK_YZ.D1,colmap(usedefaults,status=status,status1=status1);

不好使,因此還是需要使用def檔案。
DEF檔案更換
$ vi ./dirdef/source_d1.prm
defsfile ./dirdef/source_d1.def,purge
USERID ogg,PASSWORD ogg
table YZ.D1;
$ ./defgen paramfile ./dirdef/source_d1.prm 

目標端更新def檔案,具體操作可以參考https://www.cnblogs.com/lvcha001/p/13039975.html
SQL> select id,status from d1;
        ID STATUS
---------- --------------------
         6 123456789012

小結:1.需要新增欄位,全表欄位update,對於大表來說效率太低,風險大;

            2.整個流程操作新增欄位,全列更新,原欄位rename,drop ,新欄位rename,需要確認可以停業務;

           3.上述的說明操作有風險,好處是資料可以完整同步,不好的地方在於使用clob儲存,效率低,並且> 4000 bytes的長度,oracle clob是專門存在clob 對應的segments上。小於4000位元組,clob列的資料可以和表的其它行記錄存在表的blocks中,等同於varchar2

2.使用OGG 複製程式引數,擷取部分字元,小於oracle 11g varchar2 4000 bytes的限制。

 本次環境為linux redhat 6.9 11.2.0.4, OGG 19.1版本

根據思路,想要通過擷取部分長度的方式,放棄超出欄位長度的部分資料,讓目標端的表列varchar2 <4000 bytes能正常儲存。 
原因:正常情況下,重要的業務資料也很少儲存>4000位元組的,如果明視訊記憶體儲文字的早就clob了。 因此有些註釋說明類的資料並不重要,可以視情況放棄。
@STREXT Use the @STREXT function to extract a portion of a
string. For this function, Oracle GoldenGate supports the use of an escape sequence to represent characters in a string column in Unicode or in the
native character encoding of the Microsoft Windows, UNIX, and Linux operating systems. The target column must be a SQL Unicode data type if
any argument is supplied as Unicode. This function does not support NCHAR or NVARCHAR data types. Syntax @STREXT (string, begin_position, end_position) string The string from which to extract. The string can be either the name of a character column or a literal string. Enclose literals within single
quote marks. begin_position The character position at which to begin extraction. end_position The character position at which to end extraction. The end position
is included in the extraction. Example The following example uses three @STREXT functions to extract a phone number into three different columns. CopyAREA_CODE = @STREXT (PHONE, 1, 3), PREFIX = @STREXT (PHONE, 4, 6), PHONE_NO = @STREXT (PHONE, 7, 10) @STRNCAT Use the @STRNCAT function to concatenate one or more strings to a maximum length. For this function, Oracle GoldenGate supports the use of an escape sequence to represent characters in a string column in Unicode or in
the native character encoding of the Microsoft Windows, UNIX, and Linux operating systems. The target column must be a SQL Unicode data type
if any argument is supplied as Unicode. This function does not support NCHAR or NVARCHAR data types. Syntax Copy@STRNCAT (string, max_length [, string, max_length] [, ...] ) string The name of a string (character) column or a literal string that is enclosed within single quote marks. max_length The maximum string length, in characters. Example The following concatenates two strings and results in ABC123. CopyPHONE_NO = @STRNCAT ('ABCDEF', 3, '123456', 3)

測試

第一部分:模擬報錯,未出現,Oracle 19版本複製程式使用assumetargetdefs,目標端欄位長度不足時,自動擷取目標端的欄位長度字元。超出忽略


source SQL
> alter table d2 modify status varchar2(15); SQL> update d2 set status='123456789012345' where id=6; SQL> commit; target SQL> desc d2 Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER(38) CC_NAME VARCHAR2(200) WITTIME TIMESTAMP(6) STATUS VARCHAR2(10) SQL> select id,status from d2; ID STATUS ---------- -------------------- 6 1234567890 assumetargetdefs 2020-08-27T15:58:29.959-0700 WARNING OGG-06439 Oracle GoldenGate Delivery for Oracle, repa.prm: No unique key is defined for table D2.
All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key.
2020-08-27T15:58:29.960-0700 INFO OGG-02756 Oracle GoldenGate Delivery for Oracle, repa.prm: The definition for table YZ.D2 is obtained
from the trail file. 2020-08-27T15:58:29.960-0700 INFO OGG-06511 Oracle GoldenGate Delivery for Oracle, repa.prm: Using following columns in default map by
name: ID, CC_NAME, WITTIME, STATUS.
2020-08-27T15:58:29.960-0700 INFO OGG-06510 Oracle GoldenGate Delivery for Oracle, repa.prm: Using the following key columns for target
table BAK_YZ.D2: ID, CC_NAME, WITTIME, STATUS.
2020-08-27T15:58:29.969-0700 WARNING OGG-03060 Oracle GoldenGate Delivery for Oracle, repa.prm: Source column STATUS has more characters
than target column STATUS can hold. Some source characters will not be mapped during source column character validation of character set UTF-8. ······ Oracle 有告警,提示說欄位超出表列長度,自己給忽略轉換了。。。 assumetargetdefs 是以目標端表的列長度為準,所以才產生這種現象。可以理解!!!而非源端欄位長度為準。

第二部分,測試
STREXT

那為了測試引數?STREXT 這個是拆分引數,但是也可以用於擷取 target 提前準備修改引數,避免再次出現自動忽略導致的烏龍事件,那怎麼測試。 MAP YZ.D2,TARGET BAK_YZ.D2,KEYCOLS(ID),COLMAP(ID
=ID,WITTIME=WITTIME,STATUS=STATUS,CC_NAME=@STREXT(CC_NAME,1,10)); 重啟程式 source SQL> update d2 set CC_NAME='123456789012345' where id=6; SQL> commit; target SQL> desc d2 Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER(38) CC_NAME VARCHAR2(200) WITTIME TIMESTAMP(6) STATUS VARCHAR2(10) SQL> select id,cc_name from d2; ID CC_NAME ---------- -------------------- 6 1234567890
第三部分,測試 STRNCAT 

另一個引數設定 STRNCAT 整合引數,也可以用於擷取 target 提前準備修改引數,避免再次出現自動忽略導致的烏龍事件,那怎麼測試。
MAP YZ.D2,TARGET BAK_YZ.D2,KEYCOLS(ID),COLMAP(ID
=ID,WITTIME=WITTIME,STATUS=STATUS,CC_NAME=@STRNCAT(CC_NAME,5));
重啟程式

source
SQL
> update d2 set CC_NAME='6543210' where id=6;
SQL
> commit;

target
SQL
> desc d2
Name Null
? Type

----------------------------------------- -
ID NUMBER(38)
CC_NAME VARCHAR2(
200)
WITTIME TIMESTAMP(
6)
STATUS VARCHAR2(
10)
SQL
> select id,cc_name from d2;
ID CC_NAME
---------- --------
6 65432

 

相關文章