在之前的工作中,我遇到了這麼乙個需求,需要將資料庫內一千多個舊表按其原來表結構,重新建立對應的新錶。然後對舊資料的進行處理後,儲存新的資料。
不只是結構需要保持一致,還有使用者、表空間、約束、備註等也需要一併帶過去。如此一來,用「create table …… as select……」語句去建立,並不能把約束等,也保留過去,顯然不符合要求。後來還是選擇的用pl/sql匯出資料結構的方法。
不過這樣這樣處理又帶來乙個問題。要從源oracle資料庫裡,一共五六個使用者的幾萬個表裡面,人工挑選出這一千多張表,也是很費勁的一件事情。而且明顯也不智慧型。
先看一下匯出的表結構:
這裡可以將其看作是乙個格式化文字,每個建立表的語句都是以如下語句開始:
prompt
prompt creating table ……
prompt ***********************************==
prompt
明白了這一點,我們就可以遍歷所有的文字,然後將每個表的sql語句都分離出來。於是,我偷了個懶,只做了乙個大概的挑選,將大部分表的sql都匯出來了。
下一步就是用fme去格式化sql語句
用text file讀模組讀取sql語句。然後建立乙個type屬性,代表每乙個完整的sql語句的。啟用相鄰要素屬性,遍歷要素,每當以「prompt **********=」開始,則type型別加一。
轉換器引數設定如下:
轉換結果如下:
雖然也將不同表的sql語句分離了出來,不過這樣的分類並不是完全正確的,如「prompt creating table c1_320100_d_2000_dkg10」等語句,嚴格來說,需要是屬於下乙個sql語句的,不過沒關係,這些最終我們都不需要。直接用tester轉換器清理掉。
然後再建立乙個attributecreator轉換器,提取出所有以「create table @uppercase(@value(使用者名稱)). 」開始的語句,存放在乙個新的屬性tablename中,以便後期提取表名。
用aggregator轉換器以「type」為分組拼接成完整的sql語句。效果如圖下:
不過這並不是我要的那一千多個表,還需要進行處理,用stringreplacer,和attributecreator對之前儲存的tablename屬性進行處理,提取出完整的表名,和使用者名稱。
最終結果如下:
如此,便對每乙個sql語句進行了格式化,而且包含主外來鍵、表空間,使用者、和備註等。
現在整個表已經算非常規整的資料了,與我需要的表名稱和使用者進行屬性掛接就可以獲得對應的sql語句。(該錶包含對應的資料庫服務、使用者、登入密碼等)
然後將選擇出來的sql語句,輸出到sqlexecutor轉換器中,
不只是建立的sql語句,在sqlexecutor轉換器中,可以寫任何ddl和dml語句,來進行資料的處理和事務的控制。
因為fme的特性,靈活利用sqlexecutor轉換器,可以在資料庫操作的時候避免很多重複且繁瑣的工作。而又不需要去寫複雜的sql來實現。
拼接SQL語句 Oracle
因為專案需要,有一段select語句中的列,想實現可配置,因此就需要用for迴圈。但嘗試之後發現select語句中是不允許放for迴圈的。需求 select column1,column2,column3,column41,column42,column43,column44.from table1...
SQL查詢語句拼接
1.判斷引數是否為空,2.把引數中的空格去掉3.1 1永遠是真,加1 1的目的是為了接後面的條件的,否則 where and 條件 and 條件 是有語法錯誤的string sql select from 表名 where 1 1 if condition1 string.empty 再分享一下我老...
shell逐行讀取檔案拼接Sql語句並訪問資料庫
下面這段 是逐行讀取乙個檔案,這個檔案中每行是乙個id,這段 每次讀取1000行即1000個id,然後拼接成乙個sql,類似於如下格式的sql select from table where id in 1,2,3,4,1000 bin bash path bin sbin usr bin usr ...