【问题标题】:Function to detect Columns getting Updated For Oracle Apex用于检测为 Oracle Apex 更新的列的功能
【发布时间】: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


【解决方案1】:

由于 Apex UI 的行为,我会建议这样的解决方法。正如 Justin Cave 在他的评论中指出的那样,您需要测试每一列。列列表可以从更新后如果更新仅通过 Apex UI 发生,则子句。最后,如果可以在一个事务中更新多行,您可以使用复合触发器并在一封电子邮件中收集所有行级更改。

Oracle Create Trigger Statement

Oracle Data Type Comparisons

CREATE TRIGGER sample_trg
-- can list each column explicitly if updates can occur outside of Apex UI
-- I only put two in this example
AFTER UPDATE OF number_col, date_col ON sample_tbl
FOR EACH ROW
DECLARE

  l_result VARCHAR2(4000);
  l_sep    VARCHAR2(2) := ', ';

BEGIN

  -- check for differences on each of your columns
  -- I only put two in this example
  IF (:old.number_col IS NULL AND :new.number_col IS NOT NULL
      OR :old.number_col IS NOT NULL AND :new.number_col IS NULL
      OR :old.number_col != :new.number_col)
  THEN
    l_result := l_result || 'NUMBER_COL' || l_sep;
  END IF;

  IF (:old.date_col IS NULL AND :new.date_col IS NOT NULL
      OR :old.date_col IS NOT NULL AND :new.date_col IS NULL
      OR :old.date_col != :new.date_col )
  THEN
    l_result := l_result || 'DATE_COL';
  END IF;

  -- remove any trailing separator
  l_result := RTRIM(l_result, l_sep);

  -- if there were any changed columns send email
  IF (LENGTH(l_result) > 0) THEN
    send_mail('john@****', 'SAMPLE_TBL is modified ' || l_result
              ,'bi-dev@*****', 'HOST');
  END IF;

END sample_trg;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多