2009-02-17 42 views
3
declare 
begin 
    for i in (select * from emp) 
    loop 
    if i.sal=1300 then 
     update emp 
     set sal=13000; 
    end if; 
    end loop; 
end; 

此代碼正在更新工資13000的所有記錄。
相反,我想更新工資1300到13000的記錄。
您能否告訴我我犯了什麼錯誤?
我使用隱式遊標accesing記錄..
對每條記錄我檢查該記錄的SAL值..
如果在一個特定記錄薪水值是1500,我想將其更新爲15000 ..在循環中更新數據庫記錄?

回答

9

每當你可以用一個單一的做更新聲明,你應該這樣做,而不是使用循環。你會以這種方式獲得巨大的性能收益;或者反過來,更新循環會使您獲得很多性能。

如果你確實需要使用循環,當然你需要一個where條件來確保你只更新你真正想要更新的記錄。永遠奏效(即使沒有可用的唯一密鑰)的可能方式是使用ROWID虛列:

begin 
    for i in (select rowid, emp.* from emp) 
    loop 
    if i.sal=1300 then 
     update emp 
     set sal=13000 
     where rowid=i.rowid; 
    end if; 
    end loop; 
end; 

另一種可能性是使用顯式遊標和「更新... CursorName中的WHERE CURRENT 「」語法。

5

您需要在更新語句中添加約束條件。

你在看什麼會通過結果行中循環,如果發現一排的工資等於1300,如果當時中施行下面的SQL他:

update emp 
set sal=13000;

沒有該限制此更新的每一行。

25

刪除代碼,只需使用:

update emp set sal = 13000 where sal = 1300 
5

此代碼更新的所有記錄與工資13000 相反,我想更新其工資1300記錄值13000

對於每條記錄我檢查該記錄的sal值。 如果特定記錄中的工資值爲1500,我想將其更新爲15000 ..

那你到底想要什麼?

要更新只有1500的工資,你發出:

UPDATE emp 
SET sal = 15000 
WHERE sal = 1500; 

要增加所有工資的十倍,你發出:

UPDATE emp 
SET sal = sal * 10;