2012年3月14日

SQL進行全文搜索,找出所有Table相關字的欄位出來

應該有很多人感到非常的不便就是找尋資料庫的所有 Table ,可能是在某個欄位的資料。
TIPTOP 標準不含 synonym 的話也有 3千多個 Table ,總不能一個一個去 SELECT 吧~
另外 5.X 版就開始有所謂的營運中心,也就是 Table 欄位會多了 PLANT、LEGAL 欄位,
也有許多非 PLANT、LEGAL 的欄位記錄著營運中心的資料。
所以複製到測試資料庫時,當測試資料進行"還原"時,會有可能造成還原到正式的資料庫。
EX:測試資料庫在 AP刪除時,會還原正式資料庫的 rvv20 欄位,變成未匹配。

遇到此狀況時測試資料庫就需要好好的"檢視"一番..........

以下是將資料庫進行全文的檢索 SQL 語法。

create table xxxx as select imk01,imk02,imk09 from imk_file where rownum = 0;   --先建一個暫存 xxx 的 Table 存放搜尋出來的值

declare
    str varchar2(1000);
    num number;
    begin
    for i in(select column_name,table_name from user_tab_cols where data_type in('CHAR','VARCHAR','VARCHAR2'))       -- 列出此 OWNER 的所有欄位出來
    loop
      str:='insert into xxxx select '''||i.table_name||''','''||i.column_name||''',count(*) from '||i.table_name||' where '||i.column_name||'='||'''DS1''';              -- 將查詢有DS1的欄位筆數寫入暫存 xxx Table
      execute immediate str ;                                   -- 轉換並執行
      commit;
   end loop;
   end;

接下來只要執行以下的查詢 SQL 指令,就可以知道有多少筆資料存在那些 Table 裡面了。
再進行整批的資料更新,將營運中心改為測試資料庫的營運中心。

select 'update '||imk01||' set '||imk02||'= ''DS1'';',imk09 from xxxx
where imk09 <> 0
order by imk09

隨著資料庫越來越大,當然要把資料量大的 Table 獨立出來更新,不然會造成資料庫 IO 滿載,系統會變很慢,以下是用迴圈的方式更新資料,減少資料大批量更新。

declare nums number;
begin
for i in(select distinct tlf01 from TLF_FILE)
loop
   update TLF_FILE set TLF20 = 'DS1' where TLF01 = i.tlf01;
commit;
end loop;
end;

這樣完全不會影響到正式資料庫的測試資料就完成囉~