该软件包的目的是什么?

时间:2019-02-05 23:28:36

标签: oracle plsql database-trigger

我是Oracle PL / SQL的新手。我找到了这个包,并从触发器中调用它。我只是不知道这个简单的程序包代码在做什么。

从触发器中调用,如下所示:

IF INSERTING THEN
        i := STATE_PKG_OVERRIDE_CN.AffectedRows.COUNT+1;
        STATE_PKG_OVERRIDE_CN.AffectedRows(i).IDU := :new.IDU;
        STATE_PKG_OVERRIDE_CN.AffectedRows(i).cn := :new.cn;

这是包裹。有人可以解释一下它在做什么的基础吗?它返回值吗?改变一个值?什么是AffectedRows RIDARRAY或EMPTY?

create or replace PACKAGE        STATE_PKG_OVERRIDE_CN
AS
   TYPE rowid_cn IS RECORD
        (
        idu     dirxml.USR.IDU%TYPE,
        cn      dirxml.USR.CN%TYPE
        );

     TYPE RIDARRAY IS TABLE OF rowid_cn INDEX BY BINARY_INTEGER;

        AffectedRows RIDARRAY;
        EMPTY   RIDARRAY;
END;

我搜索了EMPTY,但未找到任何内容,我相信它正在创建一个record类型的表。我熟悉这两个值时,触发器将传入cn或IDU值。但是包裹在做什么?还是返回?我很困惑。
干杯

2 个答案:

答案 0 :(得分:2)

这是属于您的组织的定制软件包。 (这就是Google对您没有帮助的原因。)我们无法肯定地告诉您它的用途或用法。但是我们可以猜测。

该软件包没有任何过程或函数,它仅定义了定制类型的数组变量,可由其他程序单元(如触发器)使用。您发布的触发器将值分配给数组AffectedRows。大概此触发器将触发“每一行”。可能在同一表上还有另一个触发器触发AFTER STATEMENT,该触发器读取该数组并进行一些处理,然后分配AffectedRows := EMPTY以重置该数组。

此基础结构的目的是在触发操作之间传递状态。这样做的一个常见原因是解决变异表异常。他们有风险,因为国家不能得到保证。例如,如果在AFTER STATEMENT触发器触发AffectedRows数组之前插入失败,则数组不会重新初始化,因此后续处理将不正确(或失败)。

从11g开始,Oracle提供了复合触发器,从而消除了对此类软件包的需求。 Find out more

要进一步调查,首先您要检查USER_TRIGGERS,以在拥有您提到的触发器的表上找到其他触发器。如果这样没有帮助,或者您想查看其他表是否也使用此程序包,请运行以下查询:

select * 
from user_dependencies
where referenced_type = 'PACKAGE'
and referenced_name = 'STATE_PKG_OVERRIDE_CN'

答案 1 :(得分:0)

它始于

  • 将类型ROWID_CN声明为包含两个值的记录:IDUCN
  • 语法要求创建另一种类型(RIDARRAY),该类型基于先前声明的ROWID_CN
  • affectedrowsempty是类型为RIDARRAY数组。基本上,您可以将它们想象成具有两列IDUCN
  • 的表

现在,一个触发器:您发布的一段代码说,当有人在触发器所基于的表中插入一行时,将执行这3行。例如,

create or replace trigger trg_biu_emp 
  before insert or update on emp
  for each row
declare
  i number;
begin
  if inserting then ...

显然,在更新甚至是删除行时,都会执行一些代码。

无论如何:

  • i := ...行计算affectedrows数组(在包中声明)中元素的数量,并将1添加到该数量。例如,如果有3个元素,则i将是4
  • ...affectedrows(i).idu := :new.idu将新的 row 输入到数组中。其序号为i(在我们的示例中为4)。在表中插入一行时,触发器知道IDU列的:new值并将其放入数组中。例如,如果您使用

    insert into emp (idu, cn) values (100, 'A')
    

    然后affectedrows(4).idu = 100,而affectedrows(4).cn = 'A'

可能与EMPTY数组相似。 Google不会返回任何有用的,它只是一个定制数组。