oracle中无主键多表更新方法

来源:互联网 发布:两矩阵等价有什么性质 编辑:程序博客网 时间:2024/05/16 16:04

首先看下sql server中的一段关于多表更新的update语句

 

UPDATE table1 SET BankAccount=t_Maintenance_Account.BankAccountFROM  table1INNER JOIN table2 ON (table2.RKSAccount=table1.RKSAccount)WHERE LEN(table2.Currency)=3AND 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 ISSELECT table2.bankaccount,  table1.rowidFROM table1,table2 where table2.RKSAccount=table1_Recon.RKSAccount and LENgth(table2.Currency)=3AND 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里的代码,这种更新方法,当一条记录对应多条时,是取一个集合对被更新表中的一条数据进行更新,最近被更新的内容是集合中的最后一条数据。

原创粉丝点击