加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle – 如何在该语句的触发器内获取受语句影响的行数

发布时间:2020-12-12 13:49:42 所属栏目:百科 来源:网络整理
导读:我有一个语句级别触发器,只要对表(称为客户)执行INSERT UPDATE或DELETE操作就会触发.我想显示一条消息(到DBMS_OUTPUT),其中包含插入/更新/删除的行数. 我只想为每个触发语句提供一条消息,例如 ‘4行被插入到客户表中’. 如何从INSIDE触发器声明中访问受触发
我有一个语句级别触发器,只要对表(称为客户)执行INSERT UPDATE或DELETE操作就会触发.我想显示一条消息(到DBMS_OUTPUT),其中包含插入/更新/删除的行数.

我只想为每个触发语句提供一条消息,例如
‘4行被插入到客户表中’.

如何从INSIDE触发器声明中访问受触发语句影响的行数,即下面代码中的XXX:

CREATE OR REPLACE TRIGGER customer_changes_trigger_2
AFTER INSERT OR UPDATE OR DELETE ON customers

DECLARE
v_operation   VARCHAR(10);
v_number_rows NUMBER;


BEGIN

v_number := XXX;

IF INSERTING THEN
   v_operation := 'inserted';
END IF;

IF UPDATING THEN
   v_operation := 'updated';
END IF;

IF DELETING THEN
   v_operation := 'deleted';
END IF;

DBMS_OUTPUT.PUT_LINE
          (v_number_rows|| ' rows were ' || v_operation || ' from customers.');
END;

在文档中找不到任何内容,任何帮助表示赞赏!

一种方法是使用全局变量来跟踪行数,因为没有其他方法可以从语句级触发器获取行计数.然后,您需要三个触发器…一个语句级别在语句运行之前初始化变量,一个级别级别为每行添加一个变量,一个语句级别根据您的意愿使用行计数.首先,设置变量和一些程序来帮助它:
create or replace package PKG_ROWCOUNT is
  NUMROWS   number;

  procedure INIT_ROWCOUNT;

  procedure ADD_ONE;

  function GET_ROWCOUNT
    return number;
end PKG_ROWCOUNT;
/

create or replace package body PKG_ROWCOUNT as
  procedure INIT_ROWCOUNT is
  begin
    NUMROWS := 0;
  end;

  procedure ADD_ONE is
  begin
    NUMROWS := Nvl(NUMROWS,0) + 1;
  end;

  function GET_ROWCOUNT
    return number is
  begin
    return NUMROWS;
  end;
end PKG_ROWCOUNT;
/

初始化变量的第一个触发器:

create or replace trigger CUSTOMER_CHANGES_TRIGGER_1
  before insert or update or delete
  on CUSTOMERS
begin
  PKG_ROWCOUNT.INIT_ROWCOUNT;
end;

第二行每行更新:

create or replace trigger CUSTOMER_CHANGES_TRIGGER_2
  after insert or update or delete
  on CUSTOMERS
  for each row
begin
  PKG_ROWCOUNT.ADD_ONE;
end;
/

第三个显示总数:

create or replace trigger CUSTOMER_CHANGES_TRIGGER_3
  after insert or update or delete
  on CUSTOMERS
begin
   Dbms_output.
   PUT_LINE(PKG_ROWCOUNT.GET_ROWCOUNT || ' rows were affected.');
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读