我不确定为什么我的触发器有问题
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_name1
和 OLD.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;
/
我是一名有作业的大学生,我不确定如何解决我遇到的这个问题。我试图创建一个触发器,以便在患者 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_name1
和 OLD.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;
/