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