Oracle 如何在视图上触发在其他表中插入新旧值

Oracle 如何在视图上触发在其他表中插入新旧值,oracle,plsql,Oracle,Plsql,注意:-我的要求是,我已经创建了一个“STATUS\u ID\u VEW”视图 表申请人,如果表上发生任何变化,Soi希望 “申请人状态”列中的申请人,然后将插入记录到 “状态更改”表,其中包含旧申请人和新申请人的状态ID 系统日期,我已经尝试过这种方法,但没有发生任何事情,请建议 Datetime()不是oracle函数。改用sysdate。我认为您错过了编译错误,触发器未编译 错误(2,1):PL/SQL:SQL语句被忽略 错误(3,96):PL/SQL:ORA-00904:“日期时间”:无

注意:-我的要求是,我已经创建了一个“STATUS\u ID\u VEW”视图 表申请人,如果表上发生任何变化,Soi希望 “申请人状态”列中的申请人,然后将插入记录到 “状态更改”表,其中包含旧申请人和新申请人的状态ID 系统日期,我已经尝试过这种方法,但没有发生任何事情,请建议

  • Datetime()不是oracle函数。改用sysdate。我认为您错过了编译错误,触发器未编译

    错误(2,1):PL/SQL:SQL语句被忽略

    错误(3,96):PL/SQL:ORA-00904:“日期时间”:无效标识符

    从用户对象中选择状态,其中对象名称='TRI_STATUS_CHANGE'

  • 你用一个代替触发器。这意味着在视图(基础表)上执行触发器代码,而不是实际的插入或更新。因此,您只能在STATUS_CHANGE表中看到更改,而不能在applicator表中看到更改

  • 为什么视图上有触发器?这意味着直接在申请人表上进行的更改不会导致触发器代码的执行。因此,状态更改表上没有更改
  • 执行:

    I want to insert that records in table 'STATUS_CHANGE'(this is blank table)
     and table structure given below.
    
          CREATE TABLE "STATUS_CHANGE" 
           (
            APPLICANT_ID NUMBER, 
            PARTNER_ID NUMBER, 
            OLD_APP_STATUS_ID NUMBER(3,0),
            NEW_APP_STATUS_ID NUMBER(3,0),
            MODIFIED_ON DATE
           ) ;
    
    
    Using trigger code is given below .
    
    CREATE OR REPLACE TRIGGER TRI_STATUS_CHANGE
    INSTEAD OF INSERT OR UPDATE ON STATUS_ID_VEW 
    BEGIN
    INSERT INTO STATUS_CHANGE(APPLICANT_ID, PARTNER_ID,OLD_APP_STATUS_ID,NEW_APP_STATUS_ID,MODIFIED_ON)
    VALUES (:old.APPLICANT_ID,:old.PARTNER_ID, :old.APPLICANT_STATUS_ID, :new.APPLICANT_STATUS_ID, datetime('now'));
    END;
    /
    
    输出:

    CREATE TABLE "STATUS_CHANGE" 
           (
            APPLICANT_ID NUMBER, 
            PARTNER_ID NUMBER, 
            OLD_APP_STATUS_ID NUMBER(3,0),
            NEW_APP_STATUS_ID NUMBER(3,0),
            MODIFIED_ON DATE
           ) ;
    
    CREATE TABLE APPLICANT (    
     APPLICANT_ID NUMBER
    ,PARTNER_ID NUMBER
    ,APPLICANT_STATUS_ID NUMBER(3,0));
    
    CREATE VIEW STATUS_ID_VEW 
    AS 
    SELECT APPLICANT_ID,PARTNER_ID,APPLICANT_STATUS_ID FROM APPLICANT;
    
    
    
    CREATE OR REPLACE TRIGGER TRI_STATUS_CHANGE
    INSTEAD OF INSERT OR UPDATE ON STATUS_ID_VEW 
    BEGIN
    INSERT INTO STATUS_CHANGE(APPLICANT_ID, PARTNER_ID,OLD_APP_STATUS_ID,NEW_APP_STATUS_ID,MODIFIED_ON)
    VALUES (:new.APPLICANT_ID,:old.PARTNER_ID, :new.APPLICANT_STATUS_ID, :old.APPLICANT_STATUS_ID, sysdate);
    END;
    /
    
    insert into STATUS_ID_VEW values (1,1,1);
    insert into APPLICANT values (2,2,2);
    
    select * from STATUS_CHANGE;
    select * from APPLICANT;
    
    Insert into STATUS_ID_VEW仅执行触发器,并仅在STATUS_CHANGE表中生成一条记录(第一条输出记录)

    Insert into APPLIENT绕过触发器,只在APPLIENT表中生成一条记录(第二条输出记录)

    编辑

    APPLICANT_ID PARTNER_ID OLD_APP_STATUS_ID NEW_APP_STATUS_ID MODIFIED_ON        
    ------------ ---------- ----------------- ----------------- --------------------
               1                                              1 27-MAY-2015 13:32:09 
    
    APPLICANT_ID PARTNER_ID APPLICANT_STATUS_ID
    ------------ ---------- -------------------
               2          2                   2 
    

    当您创建触发器或插入/更新触发器时,会出现什么错误?“什么都没有发生”?触发器是否已创建,是否有效?
    datetime()
    是您自己的函数吗?出于某种原因,您正在使用它而不是
    sysdate
    ?谢谢您,Alex,触发器成功创建了是,但当我更新表时,则触发器未触发表示触发器在表“STATUS\u CHANGE”中没有插入值。请提出建议?@Robert Merkwürdigilebe非常感谢,但我需要在申请人表中申请人身份ID字段的更新中,在状态更改中插入数据表,并使用新值和旧值。申请人是现有表,它在其中有记录lakes@AnandYadav你的问题是?我已经用我认为你要求的内容更新了答案。如果这仍然不是您需要的:请更具体地说明您的功能需求,并向我们展示到目前为止您得到了什么
    CREATE OR REPLACE TRIGGER TRI_STATUS_CHANGE
    AFTER UPDATE OF APPLICANT_STATUS_ID ON APPLICANT 
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    BEGIN
      INSERT INTO STATUS_CHANGE(APPLICANT_ID, PARTNER_ID,OLD_APP_STATUS_ID,NEW_APP_STATUS_ID,MODIFIED_ON)
      VALUES (:new.APPLICANT_ID,:old.PARTNER_ID, :new.APPLICANT_STATUS_ID, :old.APPLICANT_STATUS_ID, sysdate);
    END;
    /