我想建立一个存储过程,同时更新多张表 该怎么写呢?详细看补充,谢谢
有可能更新基表的主键(ID),这时其他表作为外键的ID也将同时更新。而且关联的表很多是否需要做个触发器?考虑到并发性问题,打算在凌晨0点进行更新。其实主要是怎么在存储过程...
有可能更新基表的主键(ID),这时其他表作为外键的ID 也将同时更新。 而且关联的表很多 是否需要做个触发器? 考虑到并发性问题,打算在凌晨0点进行更新。其实主要是怎么在存储过程中判定其中一张表更新不成功,不成功的情况下,全部回滚。全部成功才提交。
展开
3个回答
展开全部
不要建触发器,一个一个update最好。
触发器太容易出问题了。
过程中间不要写commit,在结束一次性提交。
在过程最后加上exception判断。
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
触发器太容易出问题了。
过程中间不要写commit,在结束一次性提交。
在过程最后加上exception判断。
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
追问
确实做触发器能简单些,但考虑到其中的并发性,关联性等,都可能引起问题,但是 现在存在的就有50多张表关联,后续还会追加表单的- =,要写死我了~!~。
关于最后的判断,WHEN OTHERS 能判断出 有表没更新成功么? 是否需要做个FLG 在每张表更新后来标记是否成功的判断,最后通过FLG 来得出ROLLBACK 还是COMMIT呢?
追答
when others 只能判断有sql执行出错,如果你指的表没更新成功是指能抛出错误的,那就可以,如果说可能存在比如数据不存在,比如需要update一行,但实际上update0行的情况,那Exception是不能判断的,这个可以考虑增加对数据执行行的判断。就像你说的加个flag。
V_RowCount := SQL%ROWCOUNT ;
判断V_RowCount>0为true。
不过具体是否加这个判断应该是基于你的业务上的。比如有50多张表关联,但可能某些数据只更新其中的部分表,那加这个判断就是画蛇添足了。
另外,建议在
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
后面增加一些错误输出信息,因为你要更新的表太多,不输出的话很难定位的。
另外我想说一下,触发器并不简单,你想想,在触发器里面也需要一个一个表去update,其实和在存储过程里面写是一样的,只不过放在不同的位置,那何必要多做一个触发器,去触碰风险呢?
另外补充下,触发器如果出现异常,会导致你的事务失败。
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询