1. 程式人生 > >oracle中無主鍵多表更新方法

oracle中無主鍵多表更新方法

首先看下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裡的程式碼,這種更新方法,當一條記錄對應多條時,是取一個集合對被更新表中的一條資料進行更新,最近被更新的內容是集合中的最後一條資料。