oracle中無主鍵多表更新方法
阿新 • • 發佈:2019-01-24
首先看下sql server中的一段關於多表更新的update語句
UPDATE table1 SET BankAccount=t_Maintenance_Account.BankAccount
FROM table1 INNER JOIN table2 ON (table2.RKSAccount=table1.RKSAccount)
WHERE LEN(table2.Currency)=3
AND table2.BranchCode='ISAPROD'
這個update語句中涉及table1和table2的更新,如果其中rksaccount屬性是主鍵,那麼這個語句是沒有問題的。但如果這個屬性不是主鍵,那麼就可能出現這樣的情況:table2中一條記錄可以和table1種的兩條記錄進行連線,那麼此時拿哪一條資料來進行更新呢?這個不得而知。雖然這個語句在sql server中,無論連線的屬性是否為主屬性,都可以執行,但結果存在變數。
但在oracle中,如果存在這種情況,則不能編譯通過,它會提示錯誤,說的大概是mapp to a non key reserved table。那麼在oracle中如果寫這種多表更新語句呢?程式碼如下:
type ridarray IS TABLE OF rowid;
type sats_bankaccount_array IS TABLE OF sats_maintenance_account.bankaccount%TYPE;
sats_rowid ridarray;
sats_bankaccount sats_bankaccount_array;
CURSOR mycursor1 IS SELECT table2.bankaccount, table1.rowid FROM table1,table2 where table2.RKSAccount=table1_Recon.RKSAccount and LENgth(table2.Currency)=3 AND table2.BranchCode='ISAPROD'
BEGIN OPEN mycursor1; LOOP FETCH mycursor1 bulk collect INTO sats_bankaccount, sats_rowid limit 100; forall i IN 1 .. sats_rowid.COUNT UPDATE sats_excelrecon_recon SET bankaccount = sats_bankaccount(i), updated_date = sysdate, updated_by = prc_excelrecon_compile.currentuser WHERE sats_excelrecon_recon.rowid = sats_rowid(i); EXIT WHEN mycursor1 % NOTFOUND; END LOOP; CLOSE mycursor1; END;
這段是寫在procedure裡的程式碼,這種更新方法,當一條記錄對應多條時,是取一個集合對被更新表中的一條資料進行更新,最近被更新的內容是集合中的最後一條資料。