oracle中无主键多表更新方法
2011-08-30 10:42
323 查看
首先看下sql server中的一段关于多表更新的update语句
这个update语句中涉及table1和table2的更新,如果其中rksaccount属性是主键,那么这个语句是没有问题的。但如果这个属性不是主键,那么就可能出现这样的情况:table2中一条记录可以和table1种的两条记录进行连接,那么此时拿哪一条数据来进行更新呢?这个不得而知。虽然这个语句在sql server中,无论连接的属性是否为主属性,都可以执行,但结果存在变数。
但在oracle中,如果存在这种情况,则不能编译通过,它会提示错误,说的大概是mapp to a non key reserved table。那么在oracle中如果写这种多表更新语句呢?代码如下:
这段是写在procedure里的代码,这种更新方法,当一条记录对应多条时,是取一个集合对被更新表中的一条数据进行更新,最近被更新的内容是集合中的最后一条数据。
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里的代码,这种更新方法,当一条记录对应多条时,是取一个集合对被更新表中的一条数据进行更新,最近被更新的内容是集合中的最后一条数据。
相关文章推荐
- mybatis执行批量更新batch update 的方法(oracle,mysql)
- mybatis执行批量更新batch update 的方法(oracle,mysql)
- oracle 数据按主键删除慢问题的解决方法
- 安装SQL Server 2016出错提示:需要安装oracle JRE7 更新 51(64位)或更高版本问题的解决方法
- mybatis执行批量更新batch update 的方法(oracle,mysql)
- oracle 表主键ID的sequence方法(hibernate)
- oracle处理已有数据的字段(主键)类型修改方法
- Oracle 批量更新的四种方法
- mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
- 数据库更新,当主键为自增列是,插入或者更新的方法
- Oracle 更新 OPatch 工具版本 的方法 说明
- 【Oracle批量更新】根据一个大表批量更新另一大表的方法比较
- mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
- ArcGis 10+Oracle发布WFS-T服务,无法更新Feature的解决方法
- oracle中创建自增主键的方法
- mybatis执行批量更新batch update 的方法(oracle,mysql)
- Oracle 更新 OPatch 工具版本 的方法 说明
- Oracle中多表联合更新处理方法详解
- ORACLE批量更新四种方法比较
- oracle 数据按主键删除慢问题的解决方法