如何在oracle中编写更新审核列的函数

如何在oracle中编写更新审核列的函数,oracle,function,triggers,Oracle,Function,Triggers,我正在尝试编写一个触发器来更新表中的两列,为此我编写了一个函数,该函数正在执行实际的功能,并将触发器用于执行该函数: 但我有个例外,有人能告诉我这里出了什么问题吗: 我正在写的函数: CREATE OR REPLACE FUNCTION myFunction() RETURNS TRIGGER AS $$ BEGIN IF OLD.timestamp IS NOT DISTINCT FROM NEW.timestamp THEN NEW.lst_updt_ts = now()

我正在尝试编写一个触发器来更新表中的两列,为此我编写了一个函数,该函数正在执行实际的功能,并将触发器用于执行该函数:

但我有个例外,有人能告诉我这里出了什么问题吗:

我正在写的函数:

CREATE OR REPLACE FUNCTION myFunction() 
RETURNS TRIGGER AS $$
BEGIN
     IF OLD.timestamp IS NOT DISTINCT FROM NEW.timestamp THEN
    NEW.lst_updt_ts = now();
     END IF;    
    RETURN NEW;
END;

Trigger:

CREATE OR REPLACE TRIGGER Mytrigger 
BEFORE UPDATE ON mytable
FOR EACH ROW
BEGIN
  myFunction;
END;
当我编译函数时

下面是我得到的错误:

PLS-00103:在预期以下情况时遇到“)”符号:

当前删除之前存在


第1行第34列的编译错误语法肯定不是Oracle。据我所知,如果用户试图手动更新lst_updt_ts,则需要将其更新为当前时间戳。我会试着写这样的东西

CREATE OR REPLACE TRIGGER Mytrigger 
BEFORE UPDATE ON mytable
FOR EACH ROW
BEGIN
  IF :OLD.timestamp <> :NEW.timestamp THEN
    :NEW.lst_updt_ts = sysdate; -- or systimestamp;
  END IF;    
END;
创建或替换触发器Mytrigger
在更新mytable之前
每行
开始
如果:OLD.timestamp:NEW.timestamp那么
:NEW.lst_updt_ts=sysdate;--或系统时间戳;
如果结束;
结束;

语法绝对不是Oracle。据我所知,如果用户试图手动更新lst_updt_ts,则需要将其更新为当前时间戳。我会试着写这样的东西

CREATE OR REPLACE TRIGGER Mytrigger 
BEFORE UPDATE ON mytable
FOR EACH ROW
BEGIN
  IF :OLD.timestamp <> :NEW.timestamp THEN
    :NEW.lst_updt_ts = sysdate; -- or systimestamp;
  END IF;    
END;
创建或替换触发器Mytrigger
在更新mytable之前
每行
开始
如果:OLD.timestamp:NEW.timestamp那么
:NEW.lst_updt_ts=sysdate;--或系统时间戳;
如果结束;
结束;

数据库管理系统在这里抱怨您使用了一个开括号:
myFunction(
,然后在用
结束之前没有任何参数)
。去掉括号

但是,Oracle不支持PostgreSQL中已知的触发器函数语法。它也不支持
但与
没有区别

不幸的是,您甚至不能像这样通过行:

CREATE OR REPLACE FUNCTION myFunction(p_new IN OUT mytable.ROWTYPE%)
因为Oracle不将:new和:old视为行记录。我在去年的Oracle数据库想法中提出了这一点。您可以投票支持:-)链接:

目前我有两种看法:

  • 直接将代码放入触发器中
  • 编写一个函数获取:OLD.timestamp和:NEW.timestamp和:NEW.lst_updt_ts并返回修改后的:NEW.lst_updt_ts

  • DBMS抱怨您在此处使用了一个开括号:
    myFunction(
    ),然后在用
    结束之前没有任何参数)
    。去掉括号

    但是,Oracle不支持PostgreSQL中已知的触发器函数语法。它也不支持
    但与
    没有区别

    不幸的是,您甚至不能像这样通过行:

    CREATE OR REPLACE FUNCTION myFunction(p_new IN OUT mytable.ROWTYPE%)
    
    因为Oracle不将:new和:old视为行记录。我在去年的Oracle数据库想法中提出了这一点。您可以投票支持:-)链接:

    目前我有两种看法:

  • 直接将代码放入触发器中
  • 编写一个函数获取:OLD.timestamp和:NEW.timestamp和:NEW.lst_updt_ts并返回修改后的:NEW.lst_updt_ts

  • 这对我有用,谢谢,更新时间戳时遗漏了一个小更正:NEW.lst\u updt\u ts=sysdate。我刚刚添加了“:“非常感谢:)@user2108383没问题,你很好这对我有用,谢谢,更新时间戳时遗漏了一个小更正::NEW.lst\u updt\u ts=sysdate。我刚刚加了一句:“非常感谢:)@user2108383没问题,不客气