如何在Oracle PL / SQL中实现AFTER INSERT触发器?

米凯尔·哲根蒂(Mikheil Zhghenti)

我试图在PLSQL中插入触发器后实现。
目的是检查每个客户是否有多行(> 1)具有特定状态。
如果是这样,我想提出一个例外,并将插入回滚。

我正在努力实现无警告查询,这会在插入过程中导致错误。
我该如何处理?
这是我实现的触发器,我认为需要进行一些更改。

CREATE TRIGGER blatrigger
    AFTER INSERT
    ON BLATABLE
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
DECLARE
    exception_name EXCEPTION;
    PRAGMA EXCEPTION_INIT (exception_name, -20999);
BEGIN
    if (select count(*) as counter from BLATABLE where CLIENTID = :NEW.CLIENTID and STATUS='PENDING').counter > 1
    THEN
        raise exception_name;
    END IF;
END;

这是表格本身:

create table BLATABLE
(
    ID            NUMBER(19) not null primary key,
    CLIENTID     NUMBER(10),
    CREATED       TIMESTAMP(6),
    STATUS        VARCHAR2(255 char)
);
巴巴罗斯·奥赞

通过删除FOR EACH ROW和转换为以下代码,使用语句级触发器,而不是行级

CREATE OR REPLACE TRIGGER blatrigger
  AFTER INSERT ON BLATABLE
  REFERENCING NEW AS NEW OLD AS OLD

DECLARE
  counter        INT;
  exception_name EXCEPTION;
  PRAGMA EXCEPTION_INIT(exception_name, -20999);
BEGIN
  SELECT MAX(COUNT(*))
    INTO counter
    FROM BLATABLE
   WHERE STATUS = 'PENDING'
   GROUP BY CLIENTID;
     
  IF counter > 1 THEN
    RAISE exception_name;
  END IF;
END;
/

哪里

  • SELECT语句需要从IF .. THEN条件中删除
  • 最有可能的是,在行级触发器的情况下,变异表错误会出现

Demo

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章