在 PL/SQL 中的触发器内调用函数

Posted

技术标签:

【中文标题】在 PL/SQL 中的触发器内调用函数【英文标题】:Call function inside trigger in PL/SQL 【发布时间】:2013-01-30 18:31:37 【问题描述】:

所以我有一个函数,给定一个用户 id,根据他上次的体重测量计算他的 bmi(体重指数)(我有一个记录所有测量结果的表),我想编写一个触发器,每次用户插入他的体重,触发器检查用户的体重指数是否低于限制。功能还可以,但我无法让触发器工作,这就是我所拥有的:

1  CREATE OR REPLACE
2  TRIGGER BMITG
3  AFTER INSERT ON WEIGHTS
4  BEGIN
5     IF BMI(USRID)>25
6     THEN raise_application_error(-20001,'Please control your weight.');
7     END IF;
8  END;

但我得到了错误: 错误(6,3):PL/SQL:语句被忽略 错误(6,10):PLS-00201:必须声明标识符“IDENT”

我认为问题在于数据库不知道 USRID 是激活触发器的 INSERT 的用户 ID。我怎么解决这个问题? 顺便说一句,WEIGHTS 表有一个用户 ID(数字)、一个日期和一个重量(数字)。

问候

【问题讨论】:

【参考方案1】:

尝试使用:new.id 代替USRID 并添加FOR EACH ROW

【讨论】:

谢谢,触发器现在可以编译,但是在插入表时我得到一个“ORA-04091:表名正在变化,触发器/函数可能看不到它” @DanielNovais - 在触发器内部,您不能从创建触发器的表中select。使用:new.column_name从插入行的column_name列读取数据。

以上是关于在 PL/SQL 中的触发器内调用函数的主要内容,如果未能解决你的问题,请参考以下文章

什么是PL/SQL

PL/SQL 编程(三 )程序包和包体,触发器,视图,索引

在 Java 中调用 Oracle PL/SQL 中的过程或函数。返回结果集 false

从 apex 页面进程调用 pl/sql 函数

PL/SQL练习命名块: 存储过程函数触发器包

PLS-00306:调用 'GET_LINE' 时参数的数量或类型错误。在 PL/SQL 中的函数中传递字符串参数时出现此错误