oracle中 触发器 \'SCOTT.TR_EMP\' 无效且未通过重新验证是啥错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中 触发器 \'SCOTT.TR_EMP\' 无效且未通过重新验证是啥错误相关的知识,希望对你有一定的参考价值。

参考技术A 触发器
无效且未通过重新验证
估计是
创建触发器之后,编译不通过。
或者是
创建触发器之后,编译通过了,但是后面修改了其他的表,导致这个触发器无效
例如触发器里面,要插入
temp_emp
这个表。触发器创建完毕以后,
修改
temp_emp
表,删除了一个列名,导致原来编译通过的触发器,变成无效的了。
参考技术B 你好!
Create
Or
Replace
Trigger
tr_emp
Before
Insert
Or
Update
Or
Delete
On
emp
For
Each
Row
Declare
p_day
Varchar(10);
Begin
Select
to_char(Sysdate,'DY')
Into
p_day
From
dual;
If
p_day='星期日'
Then
raise_application_error(-20001,'emp表在星期天不允许使用!');
Return;
End
If;
End;
打字不易,采纳哦!

Oracle 触发器中的行号如何工作?

【中文标题】Oracle 触发器中的行号如何工作?【英文标题】:How does line numbering work in an Oracle trigger? 【发布时间】:2011-03-01 06:42:46 【问题描述】:

我有一个引发错误的触发器,但我不确定如何知道哪一行 PL/SQL 代码引发了该错误。我的错误是

[Oracle]ORA-01403:未找到数据 ORA-06512: 在 “MYSCHEMA.FOO_BI”,第 9 行

我的触发器是这样的:

create or replace TRIGGER "MYSCHEMA"."FOO_BI" 
BEFORE INSERT ON FOO REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW
DECLARE
 NUM1 NUMBER;
 NUM2 NUMBER;

BEGIN

     -- some comment
  if :new.batch_num is null then
   SELECT COUNT(*) INTO :NEW.BATCH_NUM FROM FOO WHERE CORP_ID = :NEW.CORP_ID;
  end if;

  if :new.batch_id is null or :new.batch_id = '' then
    :NEW.BATCH_ID := :NEW.CORP_ID || '-' || :NEW.BATCH_NUM;
  end if;

/* etc... */     

我发现看起来像similar question 但行号以create or replace... 开头并将我的错误行表示为注释,我认为这一定是假的。执行触发器时抛出错误时如何报告行号?

【问题讨论】:

A Nit:在 Oracle 中,空字符串等同于 null。所以or :new.batch_id = '' 等价于or :new.batch_id = null,它永远不会返回true。第一部分 :new.batch_id is null 就是你所需要的。 @Shannon:感谢您的提示!我不能声称对所有这些触发负责,但我必须承认那部分可能是我的。也许吧。 【参考方案1】:

行号(如堆栈跟踪中所报告的)从第 1 行的 DECLARE 开始。因此,如果您执行以下操作:

CREATE OR REPLACE TRIGGER foo
BEFORE INSERT ON test1 
REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW
DECLARE
n1 NUMBER := 1;
n2 NUMBER := 2;

BEGIN

  -- a comment
  IF :new.n1 IS NULL THEN
    n1 := n2/0;
  END IF;
END;
/

SQL> insert into test1 values (3,'XX','YY',NULL);

insert into test1 values (3,'XX','YY',NULL)

ORA-01476: divisor is equal to zero
ORA-06512: at "XXX.FOO", line 9
ORA-04088: error during execution of trigger 'XXX.FOO'

SQL> select line, text from all_source where name = 'FOO';

      LINE TEXT
---------- --------------------------------------------------------------------------------
         1 TRIGGER foo
         2 BEFORE INSERT ON test1
         3 REFERENCING OLD AS OLD NEW AS NEW
         4 FOR EACH ROW
         5 DECLARE
         6 n1 NUMBER := 1;
         7 n2 NUMBER := 2;
         8 
         9 BEGIN
        10 
        11   -- a comment
        12   IF :new.n1 IS NULL THEN
        13     n1 := n2/0;
        14   END IF;
        15 END;

15 rows selected

您可以看到错误报告发生在第 9 行,实际上是源代码中的第 13 行。

【讨论】:

【参考方案2】:

行号指的是 Oracle 数据字典中存储的源。您可以通过查看数据字典视图来确定实际的行号。

SELECT text
  FROM all_source
  WHERE owner = 'MYSCHEMA'
    AND name = 'FOO_BI'
    AND type = 'TRIGGER'
    AND line = 9;

【讨论】:

以上是关于oracle中 触发器 \'SCOTT.TR_EMP\' 无效且未通过重新验证是啥错误的主要内容,如果未能解决你的问题,请参考以下文章

如何通过c#读取oracle数据库中的long类型字段

oracle正则表达式截取某个字符前的数字

oracle触发器中需要通过字段来进行判断

oracle 正则表达式

oracle怎么删除用户添加的系统表空间

请解释一下这个颇让oracle触发器