如何在oracle中调用触发器函数

如何在oracle中调用触发器函数,oracle,plsql,database-trigger,Oracle,Plsql,Database Trigger,如何在oracle中调用单独的触发器函数。我知道在postgres中调用触发器函数的语法是 create OR replace trigger_test after update or delete on person_info FOR EACH ROW EXECUTE FUNCTION trig_function(); 此外,在postgres中,我可以在函数trig_function()中获取表person_info的所有新旧值 有没有一种方法可以在oracle中模拟与我发现的有关触发

如何在oracle中调用单独的触发器函数。我知道在postgres中调用触发器函数的语法是

create OR replace trigger_test 
after update or delete on person_info 
FOR EACH ROW EXECUTE FUNCTION trig_function();
此外,在postgres中,我可以在函数trig_function()中获取表person_info的所有新旧值


有没有一种方法可以在oracle中模拟与我发现的有关触发器的文档中相同的东西,这与postgres触发器有一点不同。

在oracle触发器中,触发器是一个整体条目,由头(
创建或替换触发器…
)和一个PL/SQL块组成,在触发事件发生时调用该块。例如:

CREATE OR REPLACE TRIGGER EMPLOYEES_BIU
  BEFORE INSERT OR UPDATE ON EMPLOYEES
  FOR EACH ROW
DECLARE                    -- This is only included to demonstrate that 
  nSome_variable  NUMBER;  -- you can include a DECLARE section.
BEGIN                      
  IF INSERTING THEN
    :NEW.ADD_DATE := SYSDATE;
    :NEW.ADD_USER := UID;
  ELSIF UPDATING THEN
    :NEW.ADD_DATE := :OLD.ADD_DATE;
    :NEW.ADD_USER := :OLD.ADD_USER;
    :NEW.MTC_DATE := SYSDATE;
    :NEW.MTC_USER := UID;
  END IF;
END EMPLOYEES_BIU;

旧值和新值可通过伪行
:Old
:new

获得。我希望您正在尝试从触发器中调用函数。如果是这样的话,你可以这样做

create or replace trigger trigger_test
after update or delete on person_info 
for each row
declare
c_person person_info<specify your type>%TYPE
begin
if trig_function(:NEW.person) != c_person; -- not sure what your function returns
--your logic here

end if;
end; 
/

在Oracle中没有“触发器函数”这样的东西(而且该代码一开始并不“调用”该函数)。创建触发器的完整语法记录了trig_函数(:NEW.person)!=“ABC”。为什么我不能直接扣动扳机function@Abhishek因为我不知道你的函数会返回什么。我只是假设在提供的示例中它将返回一个字符串/varchar,所以这样做了。我已经编辑了我的回答您不能直接调用触发器函数,因为Oracle中没有对应于Postgres触发器函数的东西。触发器本身包含代码,请参见@BobJarvis的答案。该函数的原因是触发器可以调用函数的一个示例。也许,选择的函数名有误导性,因为触发器可以调用任何函数(根据适当的访问)。@Paul我不能将新旧数据结构传递给trig_函数()吗procedure@Abhishek您是如何尝试传递这些值的?数据库中触发器的主要用途是,如果希望它运行,则不能显式地引发它。唯一的方法是引发事件。此外,传递参数不是触发器定义的一部分,但您可以处理事件属性(可以传递给可能包含函数或过程的触发器主体)。我建议您编写自己的select语句,以获取触发器主体中的值,调用函数并实现逻辑。
create or replace trigger trigger_test
    after update or delete on person_info 
    for each row
    begin
   if trig_function(:NEW.person) != "ABC"  ---- not sure what your function returns
   ----implement your logic with the function

   end if;
    end; 
    /