可以用游標(biāo)來執(zhí)行更新,也可以用update語句更新。
目前成都創(chuàng)新互聯(lián)已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站運營、企業(yè)網(wǎng)站設(shè)計、瑞麗網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
但是oracle沒有update from語句,可以用子查詢來給源數(shù)據(jù)表的字段賦值,如果需要賦多個值的話,則用括號括起來,格式:
update?table_name
set?(field1,?field2,?...?)?=?(select?value1,?value2,?...?from?source_table)
where?...
而where條件中則可以用exists測試是否要更新記錄。更新語句大概這樣:
update?A?s1
set?a5?=?(select?b6?
from?B?s2?
where?s2.b1?=?s1.a1?and?s2.b2?=?s1.a2?and?s2.b3?=?s1.a3?and?rownum?=?1)
where?exists?(
select?b6?
from?B?s2?
where?s2.b1?=?s1.a1?and?s2.b2?=?s1.a2?and?s2.b3?=?s1.a3?and?rownum?=?1
)
即賦值子句和where條件是類似的。
看具體怎么更新了,一般語法是:
update?表名?set?字段='xxx'?where?條件;
commit;
這個所有數(shù)據(jù)庫基本一致,都是這個語法
先建立一個結(jié)構(gòu)一模一樣的表emp1,并為其插入部分數(shù)據(jù)
create table emp1
as
select * from emp where deptno = 20;
update掉emp1中的部分數(shù)據(jù)
update emp1
set sal = sal 100,
comm = nvl(comm,0) 50
然后我們試著使用emp1中數(shù)據(jù)來更新emp中sal 和 comm這兩列數(shù)據(jù)。
我們可以這么寫
Update emp
Set(sal,comm) = (select sal,comm. From emp1 where emp.empno = emp1.empno)
Where exists (select 1 from emp1 where emp1.empno = emp.empno)
請你尤其注意這里的where子句,你可以嘗試不寫where子句來執(zhí)行以下這句話,你將會使得emp中的很多值變成空。
這是因為在oracle的update語句中如果不寫where子句,oracle將會默認的把所有的值全部更新,即使你這里使用了子查詢并且某在值并不能在子查詢里找到,你就會想當(dāng)然的以為,oracle或許將會跳過這些值吧,你錯了,oracle將會把該行的值更新為空。
我們還還可以這么寫:
update (select a.sal asal,b.sal bsal,a.comm acomm,
b.comm bcomm from emp a,emp1 b where a.empno = b.empno)
set asal = bsal,
acomm = bcomm;
這里的表是一個類視圖。當(dāng)然你執(zhí)行時可能會遇到如下錯誤:
ERROR 位于第 2 行:
ORA-01779: 無法修改與非鍵值保存表對應(yīng)的列
這是因為新建的表emp1還沒有主鍵的緣故
下面增加一個主鍵
alter table emp1
add constraint pk_emp1 primary key (empno);
執(zhí)行之后
在執(zhí)行前面的語句就能成功。
這里我們總結(jié)一下:
在oracle中不存在update from結(jié)構(gòu),所以遇到需要從另外一個表來更新本表的值的問題的時候,有兩種解決的辦法:
一種是使用子查詢,使用子查詢時一定要注意where條件(一般后面接exists子句),除非兩個表是一一對應(yīng)的,否則where條件必不可少,遺漏掉where條件時可能會導(dǎo)致插入大量空值。
另外一種是類視圖的更新方法,這也是oracle所獨有的。先把對應(yīng)的數(shù)據(jù)全部抽取出來,然后更新表一樣更新數(shù)據(jù),這里需要注意的是,必須保證表的數(shù)據(jù)唯一型。
操作步驟如下:
準(zhǔn)備數(shù)據(jù):在excel中構(gòu)造出需要的數(shù)據(jù)
2.將excel中的數(shù)據(jù)另存為文本文件(有制表符分隔的)
3.將新保存到文本文件中的數(shù)據(jù)導(dǎo)入到pl*sql中
在pl*sql中選擇tools--text
importer,在出現(xiàn)的窗口中選擇"Data
from
Textfile",然后再選擇"Open
data
file",
在彈出的文件選擇框中選中保存有數(shù)據(jù)的文本文件,此時將會看到data
from
textfile中顯示將要導(dǎo)入的數(shù)據(jù)
4.在configuration中進行如下配置
注:如果不將"Name
in
header"勾選上會導(dǎo)致字段名也當(dāng)做記錄被導(dǎo)入到數(shù)據(jù)庫中,從而導(dǎo)致數(shù)據(jù)錯誤
5.點擊data
to
oracle,選擇將要導(dǎo)入數(shù)據(jù)的表,并在fields中將文本中的字段與表中的字段進行關(guān)聯(lián)
6.點擊import按鈕進行導(dǎo)入
7.查看導(dǎo)入的數(shù)據(jù)
OK,至此數(shù)據(jù)導(dǎo)入成功。