您的位置:首页 > 数据库 > Oracle

oracle中无主键多表更新方法

2011-08-30 10:42 323 查看
首先看下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里的代码,这种更新方法,当一条记录对应多条时,是取一个集合对被更新表中的一条数据进行更新,最近被更新的内容是集合中的最后一条数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: