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里的代码,这种更新方法,当一条记录对应多条时,是取一个集合对被更新表中的一条数据进行更新,最近被更新的内容是集合中的最后一条数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值