怎樣使用Oracle 10g MERGE語句更新數(shù)據(jù)行
使用Oracle 10g MERGE語句更新數(shù)據(jù)行
在Oracle 9i R2版中引入的MERGE語句通常被稱作“更新插入”(upsert),因?yàn)槭褂肕ERGE可以在同一個(gè)步驟中更新(update)并插入()數(shù)據(jù)行,對(duì)于抽取、轉(zhuǎn)換和載入類型的應(yīng)用軟件可以節(jié)省大量寶貴的時(shí)間,比如向數(shù)據(jù)倉庫中加載數(shù)據(jù),數(shù)據(jù)倉庫中沒有的數(shù)據(jù)行可以插入到數(shù)據(jù)倉庫中,而已經(jīng)存在的數(shù)據(jù)行也同時(shí)被更新。
在MERGE語句引入的時(shí)候,需要同時(shí)使用一條UPDATE和一條INSERT語句,順序也是固定的(先使用UPDATE語句,然后是INSERT語句)。如果您只需要使用其中的某一條一句,您只需要使用現(xiàn)有的INSERT或者UPDATE語句,而不必使用MERGE語句,而刪除數(shù)據(jù)可以使用DELETE語句。
在Oracle 10g R1版中,MERGE語句發(fā)生了變化,UPDATE或INSERT語句不再是必須的,而是可選項(xiàng),您可以兩者都用也可以都不用,而且,UPDATE語句也具備了DELETE的功能,您可以在同一個(gè)步驟中對(duì)現(xiàn)有的有效記錄進(jìn)行升級(jí)并清理廢棄的記錄。
列表A創(chuàng)建了一個(gè)表格列出現(xiàn)有項(xiàng)目:項(xiàng)目號(hào)碼、標(biāo)題、開始日期、進(jìn)度完成比例以及員工對(duì)項(xiàng)目的響應(yīng),還創(chuàng)建了一個(gè)事務(wù)表格使用MERGE語句進(jìn)行升級(jí)批處理。
列表A
DROP TABLE open_projects;DROP TABLE project_updates;CREATE TABLE open_projects(pno NUMBER(6) PRIMARY KEY,title VARCHAR2(40),startdate DATE,pctdone NUMBER(3),empno NUMBER(6)INSERT INTO open_projects VALUES(10, 'Inventory servers', '08-JAN-07',0, 206);INSERT INTO open_projects VALUES(20, 'Upgrade Oracle on SRV01','15-JAN-07', 0, 206);INSERT INTO open_projects VALUES(30, 'Conduct skills assessment','22-JAN-07', 0, 210);CREATE TABLE project_updates(action CHAR(1),pno NUMBER(6),pctdone NUMBER(3),empno NUMBER(6)INSERT INTO project_updates VALUES('C', 10, 50, 214);INSERT INTO project_updates VALUES('D', 20, NULL, NULL);COMMIT;
一個(gè)典型的MERGE語句從識(shí)別表格開始執(zhí)行升級(jí),而且對(duì)現(xiàn)有的記錄進(jìn)行篩選測試:
MERGE INTO open_projects opUSING project_updatespuON (op.pno = pu.pno)
表格open_projects會(huì)接受更新的數(shù)據(jù),而project_updates表格則不會(huì)改變,如果項(xiàng)目號(hào)碼(pno)在兩個(gè)表格中都一樣,那么數(shù)據(jù)行則被認(rèn)為是相同的。
MERGE語句剩下的部分是更新語句,以及DELETE WHERE語法。
WHEN MATCHED THENUPDATE SET pctdone = pu.pctdone,empno = pu.empnoDELETEWHERE pu.action = 'D';
列表B展示了MERGE語句運(yùn)行前后的表格情況。
列表B
SQL> @mergedel_bPNO TITLE STARTDATE PCTDONE EMPNO10 Inventory servers 08-JAN-07 0 20620 Upgrade Oracle on SRV01 15-JAN-07 0 20630 Conduct skills assessment 22-JAN-07 0 210A PNO PCTDONE EMPNOC 10 50 214D 202 rows merged.PNO TITLE STARTDATE PCTDONE EMPNO10 Inventory servers 08-JAN-07 50 21430 Conduct skills assessment 22-JAN-07 0 210A PNO PCTDONE EMPNOC 10 50 214D 20SQL> spool off
第一個(gè)事務(wù)對(duì)第10號(hào)項(xiàng)目進(jìn)行了改變(操作‘c’),項(xiàng)目完成比例從0變成了50,項(xiàng)目員工人數(shù)變成了214人;第二個(gè)事務(wù)產(chǎn)出了第20號(hào)項(xiàng)目,“隨后”的列表展示了刪除后的狀態(tài),而project_updates表格沒有發(fā)生改變。這個(gè)例子展示了這些語句并不是必須的,而且在MERGE語句中也并不需要使用INSERT語句。
Oracle函數(shù)集錦
感于總有些網(wǎng)友提出一些非常基礎(chǔ)的問題,比如有沒有實(shí)現(xiàn)某某功能的函數(shù)啊,某某函數(shù)是做什么用的啊,格式是什么等等,同時(shí)也感受到自己對(duì)oracle函數(shù)認(rèn)識(shí)的不足,于是集中月余時(shí)間專注于oracle函數(shù),小有心得不敢私藏,發(fā)之與諸公共享。
本文并不準(zhǔn)備介紹全部的oracle函數(shù),當(dāng)前情勢下,俺也還沒這個(gè)時(shí)間,需要學(xué)習(xí)的東西太多了,要把多數(shù)時(shí)間花在學(xué)習(xí)經(jīng)常能用上的技術(shù)方面:),所以如果是準(zhǔn)備深入了解所有oracle函數(shù)的朋友,還是去關(guān)注:Oracle SQL Reference官方文檔更靠譜一些。
本文更多將會(huì)介紹三思在日常中經(jīng)常會(huì)用到的,或者雖然很少用到,但是感覺挺有意思的'一些函數(shù)。分二類介紹,分別是:
著名函數(shù)篇-經(jīng)常用到的函數(shù)
非著名函數(shù)篇-即雖然很少用到,但某些情況下卻很實(shí)用
注:N表示數(shù)字型,C表示字符型,D表示日期型,[]表示內(nèi)中參數(shù)可被忽略,fmt表示格式。
單值函數(shù)在查詢中返回單個(gè)值,可被應(yīng)用到select,where子句,start with以及connect by 子句和having子句。
(一).數(shù)值型函數(shù)(Number Functions)
數(shù)值型函數(shù)輸入數(shù)字型參數(shù)并返回?cái)?shù)值型的值。多數(shù)該類函數(shù)的返回值支持38位小數(shù)點(diǎn),諸如:COS, COSH, EXP, LN, LOG, SIN, SINH, SQRT, TAN, and TANH 支持36位小數(shù)點(diǎn)。ACOS, ASIN, ATAN, and ATAN2支持30位小數(shù)點(diǎn)。
1、MOD(n1,n2) 返回n1除n2的余數(shù),如果n2=0則返回n1的值。
例如:SELECT MOD(24,5) FROM DUAL;
2、ROUND(n1[,n2]) 返回四舍五入小數(shù)點(diǎn)右邊n2位后n1的值,n2缺省值為0,如果n2為負(fù)數(shù)就舍入到小數(shù)點(diǎn)左邊相應(yīng)的位上(雖然oracle documents上提到n2的值必須為整數(shù),事實(shí)上執(zhí)行時(shí)此處的判斷并不嚴(yán)謹(jǐn),即使n2為非整數(shù),它也會(huì)自動(dòng)將n2取整后做處理,但是我文檔中其它提到必須為整的地方需要特別注意,如果不為整執(zhí)行時(shí)會(huì)報(bào)錯(cuò)的)。
例如:SELECT ROUND(23.56),ROUND(23.56,1),ROUND(23.56,-1) FROM DUAL
3、TRUNC(n1[,n2] 返回截尾到n2位小數(shù)的n1的值,n2缺省設(shè)置為0,當(dāng)n2為缺省設(shè)置時(shí)會(huì)將n1截尾為整數(shù),如果n2為負(fù)值,就截尾在小數(shù)點(diǎn)左邊相應(yīng)的位上。
例如:SELECT TRUNC(23.56),TRUNC(23.56,1),TRUNC(23.56,-1) FROM DUAL;
【怎樣使用Oracle 10g MERGE語句更新數(shù)據(jù)行】相關(guān)文章:
使用外貿(mào)英語語句05-20
怎樣使用成考英語大綱復(fù)習(xí)12-27
oracle論文開題報(bào)告07-05
Oracle面試試題06-22
Oracle DBA面試試題06-17
Oracle面試試題題庫06-17
如何更新新西蘭駕照11-12
Oracle面試題庫06-19
oracle論文的參考文獻(xiàn)11-24