我对oracle中的BEFORE INSERT TRIGGER有一点疑问, 我的触发器看起来像这样:
CREATE OR REPLACE TRIGGER some_trigger BEFORE INSERT
ON some_table REFERENCING NEW AS newRow
FOR EACH ROW
DECLARE
some_var number(25, 4);
BEGIN
-- do some stuff
:newRow.some_column :=some_var;
exception
when no_data_found then
NULL;
when others then
NULL;
END;
这里我在newRow.some_column上做的更新是可选的,所以我的要求是即使触发器失败,newRow也应该插入表中,这就是我吃掉异常的原因。
我的假设是否正确,如果我吃掉异常,newRow会在所有场景中插入到表格中吗?
谢谢你。
答案 0 :(得分:3)
您的异常“处理”将确保插入成功,即使您的触发器中有例外。
一些想法:
您当前的代码不会导致NO_DATA_FOUND
- 例外。
您真的希望您的代码无声地失败吗?
为什么同时抓住NO_DATA_FOUND
和OTHERS
而忽略两者? OTHERS
也会抓住NO_DATA_FOUND
。
修改强>
我只是抓住NO_DATA_FOUND
并添加一个好评论,说明为什么你可以在你的情况下默默地忽略它。
确保SELECT只返回一行,否则也需要处理TOO_MANY_ROWS
。
忽略OTHERS
通常被视为不良做法。您的代码可能会失败,您永远不会注意到。实际上有一个新的Compiler Warning。