系統做資料同步,新的資料就用 Insert ,原本的資料就用 Update 指令,
當然也可以全部資料 delete 掉再全部重新 Insert 進去,
從 Oracle 10g 的版本開始就提供了一個 Marge 的指令,可以解決很多資料比對上的問題。
Merge 指令的缺點就是,只能二個 Table 進行資料異動。
優點是使用 Update 更新時要注意找不到資料會更新為 Null 的情況,用 Merge 可以避免。
例如:TableA 要依據 TableB 的欄位更新過來,一般都會寫:
update TableA set (ColumnA2,ColumnA3) =
(select ColumnB2,ColumnB3 from TableB where ColumnB1 = ColumnA1)
但是如果要再增加判斷 TableB 的 ColumnB2 不是空的才更新,這樣要改成:
update TableA set (ColumnA2,ColumnA3) =
(select nvl(ColumnB2,ColumnA1),ColumnB3 from TableB where ColumnB1 = ColumnA1)
有了 Merge 的指令就可以比較有直覺的 SQL 語法了。
merge into TableA a a using TableB b on (a.ColumnA1= b.ColumnB1)
when matched then
update set a.ColumnA2= b.ColumnB2, a.ColumnA3 = b.ColumnB3 where b.ColumnB2 is not null
when not matched then
insert (ColumnA1,ColumnA2,ColumnA3) values (ColumnB1,ColumnB2,ColumnB3)
Marge 指令要如何變化不彷就研究試試看吧~~
2012年10月25日
2012年10月8日
將 CONSTRUCT 所輸入的欄位拆開來
通常報表要判斷多個欄位的時候,
都是用 CONSTRUCT BY NAME tm.wc ON 欄位1,欄位2,欄位3…
有時候欄位1要另外判斷,欄位2又要另外判斷的時候怎麼辦,
這樣 tm.wc 已經組好 SQL 的語法,總不能用字串去拆吧,可能會有錯誤的情況。
當然你也可以分寫開三次 CONSTRUCT ,只是使用者要按三次確定才行。
山不轉路轉,就變化一下吧~~
這時候 GET_FLDBUF 的指令就可以派上用場了。
只是抓出來的卻是使用者輸入查詢的字串,SQL 根本不能拿來用。
只在原本的 CONSTRUCT 加上:
AFTER CONSTRUCT
LET tm.wc1 = GET_FLDBUF(imd01)
LET tm.wc2 = GET_FLDBUF(sfa01)
LET tm.wc3 = GET_FLDBUF(sfa03)
再來就是增加三個 CONSTRUCT,這樣就分別對應到 tm.wc1, tm.wc2, tm.wc3 。
之後的 SQL 就只要抓 wc1,wc2,wc3 的值就好了。
CONSTRUCT BY NAME tm.wc1 ON imd01
BEFORE CONSTRUCT
DISPLAY tm.wc1 TO FORMONLY.imd01
EXIT CONSTRUCT
END CONSTRUCT
CONSTRUCT BY NAME tm.wc2 ON sfa01
BEFORE CONSTRUCT
DISPLAY tm.wc2 TO FORMONLY.sfa01
EXIT CONSTRUCT
END CONSTRUCT
CONSTRUCT BY NAME tm.wc3 ON sfa03
BEFORE CONSTRUCT
DISPLAY tm.wc3 TO FORMONLY.sfa03
EXIT CONSTRUCT
END CONSTRUCT
雖然是很白痴的用法,不過至少也是可以解決不少特殊報表的需求。
都是用 CONSTRUCT BY NAME tm.wc ON 欄位1,欄位2,欄位3…
有時候欄位1要另外判斷,欄位2又要另外判斷的時候怎麼辦,
這樣 tm.wc 已經組好 SQL 的語法,總不能用字串去拆吧,可能會有錯誤的情況。
當然你也可以分寫開三次 CONSTRUCT ,只是使用者要按三次確定才行。
山不轉路轉,就變化一下吧~~
這時候 GET_FLDBUF 的指令就可以派上用場了。
只是抓出來的卻是使用者輸入查詢的字串,SQL 根本不能拿來用。
只在原本的 CONSTRUCT 加上:
AFTER CONSTRUCT
LET tm.wc1 = GET_FLDBUF(imd01)
LET tm.wc2 = GET_FLDBUF(sfa01)
LET tm.wc3 = GET_FLDBUF(sfa03)
再來就是增加三個 CONSTRUCT,這樣就分別對應到 tm.wc1, tm.wc2, tm.wc3 。
之後的 SQL 就只要抓 wc1,wc2,wc3 的值就好了。
CONSTRUCT BY NAME tm.wc1 ON imd01
BEFORE CONSTRUCT
DISPLAY tm.wc1 TO FORMONLY.imd01
EXIT CONSTRUCT
END CONSTRUCT
CONSTRUCT BY NAME tm.wc2 ON sfa01
BEFORE CONSTRUCT
DISPLAY tm.wc2 TO FORMONLY.sfa01
EXIT CONSTRUCT
END CONSTRUCT
CONSTRUCT BY NAME tm.wc3 ON sfa03
BEFORE CONSTRUCT
DISPLAY tm.wc3 TO FORMONLY.sfa03
EXIT CONSTRUCT
END CONSTRUCT
雖然是很白痴的用法,不過至少也是可以解決不少特殊報表的需求。
訂閱:
意見 (Atom)