当BEFORE INSERT TRIGGER在oracle中失败时会发生什么

时间:2010-07-09 10:50:31

标签: oracle exception plsql triggers

我对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会在所有场景中插入到表格中吗?

谢谢你。

1 个答案:

答案 0 :(得分:3)

您的异常“处理”将确保插入成功,即使您的触发器中有例外。

一些想法:

  1. 您当前的代码不会导致NO_DATA_FOUND - 例外。

  2. 您真的希望您的代码无声地失败吗?

  3. 为什么同时抓住NO_DATA_FOUNDOTHERS而忽略两者? OTHERS也会抓住NO_DATA_FOUND

  4. 修改

    我只是抓住NO_DATA_FOUND并添加一个评论,说明为什么你可以在你的情况下默默地忽略它。
    确保SELECT只返回一行,否则也需要处理TOO_MANY_ROWS

    忽略OTHERS通常被视为不良做法。您的代码可能会失败,您永远不会注意到。实际上有一个新的Compiler Warning