【发布时间】:2022-11-10 10:54:54
【问题描述】:
我编写了一个函数来检测表的哪些列正在更新。
此表存在于 Oracle Apex 中。
我使用此功能发送邮件以进行更新通过 APEX 用户界面在上面。
触发代码:
create or replace TRIGGER TRIAL AFTER UPDATE ON TABLE
FOR EACH ROW
DECLARE
result varchar2(4000);
begin
result := snap_fun('TABLE_NAME');
SEND_MAIL('JOHN@****',
'TABLE Modified',result,'bidev-noreply@***','HOST');
end;
功能码
create or replace function SNAP_FUN(inTableName in varchar2) return varchar2 is
result varchar2(4000);
sep varchar2(2) := null;
begin
for c in (select column_name from all_tab_columns where table_name = inTableName) loop
if updating(c.column_name) then
result := result || sep || c.column_name;
sep := ', ';
end if;
end loop;
return result;
end;
问题:当我通过后端更新任何列时,我收到正确的邮件,其中只有列实际上正在更新,但是当我通过 Oracle Apex 更新(使用 UI)时,我收到了所有列的列表。
【问题讨论】:
-
我不确定您的 APEX 应用程序在做什么。但我敢打赌,您想检查
:new.column是否等于:old.column值,而不是update语句是否包含有问题的列。通常,将编写应用程序以将它们可以更新的所有列放在update语句中,而不是根据实际更新的列动态构建update语句。 -
据我所知,这就是 Apex 正在做的事情。
-
@Littlefoot,我有 17 列需要监视 DML,如果您为 IF -ELSE -THEN 提供一个结构,这样如果所有 if 为真且非跳过,则它满足此条件是否可以。即,如果不止一个列得到更新,我也会收到其余列的邮件,而不仅仅是第一个真实条件。
-
@JustinCave 列可以有两个可接受的值 Locked / Unlocked,我们使用一个按钮在 then 和另一个按钮“save”之间切换以提交更改。
标签: oracle plsql triggers oracle-apex