我不确定为什么我的触发器有问题

I'm not sure why my Trigger is having problems

我是一名有作业的大学生,我不确定如何解决我遇到的这个问题。我试图创建一个触发器,以便在患者 inserted/deleted into/from 之后将患者 table,值(在 IF 语句中)插入到新的 table,patient_log.

尝试次数:
1. 我的 INSERT 语句有效(我将它与触发器和 if 语句分开测试)。
2.我也试过"REFERENCES OLD AS OLD NEW AS NEW"
3. 我试图在 "NEW" 和 "OLD" 前添加“:”,但 SQL 弹出引用不正确的错误消息。

**** 请使编码尽可能简单。换句话说,代码应该就像您正在学习过程和触发器的基础知识一样(我希望这是有道理的)。

set pagesize 100
set linesize 130
set echo on

CREATE OR REPLACE TRIGGER after_pat AFTER INSERT OR DELETE ON patient 
FOR EACH ROW
DECLARE
pat_name1 VARCHAR(41);

BEGIN
SELECT pat_name INTO pat_name1 FROM patient
    WHERE patient_ID = :NEW.patient_ID OR patient_ID = :OLD.patient_ID;

IF inserting THEN
    INSERT INTO patient_log
 VALUES('New patient '||NEW.pat_name1||' inserted at ', TO_CHAR(sysdate,'Month DD, YYYY HH:MI PM'));
END IF;

IF deleting THEN 
    INSERT INTO patient_log
        VALUES('Patient '||OLD.pat_name1||' released at ',TO_CHAR(sysdate,'Month DD, YYYY HH:MI PM')); 
END IF;

END after_pat;
/

__________________________________________________________________
>ERROR CODES I get: 
>It's for the IF statements i.e. "IF inserting then" & "IF deleting then"
>
>LINE/COL ERROR
>-------- -----------------------------------------------------------------
>9/2      PL/SQL: SQL Statement ignored<BR>
>10/29    PL/SQL: ORA-00984: column not allowed here
>14/2     PL/SQL: SQL Statement ignored<BR>
>15/26    PL/SQL: ORA-00984: column not allowed here
SQL> 
______________________________________________________
> SQL> desc patient_log;
 Name  Type
 **MESSAGE**                                                                          VARCHAR2(50)
 **TIME1**                                                               VARCHAR2(30)

首先,将您的 SELECT 移到 if inserting/deleting 中,并相应地调整它:要么 您搜索新记录, 用于旧记录,不能同时进行。

然后只需在 INSERT INTO 日志中使用变量 pat_name1。发生错误是因为您没有使用变量,而是使用 NEW.pat_name1OLD.pat_name1 无效的

像这样:

CREATE OR REPLACE TRIGGER after_pat AFTER INSERT OR DELETE ON patient 
FOR EACH ROW
DECLARE
pat_name1 VARCHAR(41);

BEGIN

IF INSERTING THEN

    SELECT pat_name INTO pat_name1 FROM patient WHERE patient_ID = :NEW.patient_ID;

    INSERT INTO patient_log  VALUES('New patient ' || pat_name1 || ' inserted at ', TO_CHAR(sysdate,'Month DD, YYYY HH:MI PM'));

END IF;

IF DELETING THEN 

    SELECT pat_name INTO pat_name1 FROM patient WHERE patient_ID = :OLD.patient_ID;

    INSERT INTO patient_log VALUES('Patient ' || pat_name1 || ' released at ',TO_CHAR(sysdate,'Month DD, YYYY HH:MI PM')); 
END IF;

END after_pat;
/