如何在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没问题,不客气