資料遷移判斷非空約束

dbhelper發表於2014-11-26
在資料遷移中,經常會碰到null值的問題,比如在源庫中,某些列可能是null值,但是在目標庫中,卻有非空約束。這樣在資料的遷移過程中就會發生問題。
為了更好的對資料的非空問題進行判斷,我寫了如下的指令碼來生成檢查的指令碼,基本的思路就是生成動態sql,類似 select count(1) from xxx where xxx is null,如果輸出結果不為0,說明在源庫中存在著非空約束的問題。

指令碼需要在目標庫中生成,然後在源庫執行即可,可以在執行的過程中,考慮加入並行等。
因為非空約束的條件在user_constraints中式long型別卡所以不能做字串拼接等操作,就當做獨立的一列來處理。

sqlplus -s n1/n1 <  set linesize 150
 set feedback off
 set pages 0
 col search_pre format a58
 col search_condition format a50
spool not_null_constraint_$1.sql_tmp
 select /*+rule*/
  'select count(1) from ' || table_name || ' where ' search_pre,
  search_condition, ';'
   from user_constraints
  where table_name =upper( '$1')
    and constraint_type = 'C'
    and constraint_name in
        (select constraint_name
           from user_cons_columns
          where table_name = upper('$1')
            and column_name in (select column_name
                                  from user_tab_cols
                                 where table_name =upper( '$1')
                                   and nullable = 'N'));
spool off;

EOF

sed 's/ NOT / /g' not_null_constraint_$1.sql_tmp > not_null_constraint_$1.sql
rm not_null_constraint_$1.sql_tmp
exit 

比如對於表T來說,object_id,object_name含有非空約束。
SQL> desc t
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 OBJECT_ID                                 NOT NULL NUMBER
 OBJECT_NAME                               NOT NULL VARCHAR2(30)
 OBJECT_TYPE                                        VARCHAR2(19)
 CLOB_TEST                                          CLOB


執行指令碼後,生成的sql指令碼內容如下所示,達到了預期的目標。

select count(1) from T where                               "OBJECT_NAME" IS NULL                          ;                                       
select count(1) from T where                               "OBJECT_ID" IS NULL                            ;                                       

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

相關文章