SQL PLUS触发器编译错误
我试图创建一个触发器来计算每个insert命令的派生属性。然而,我得到编译错误,我不知道哪里是问题SQL PLUS触发器编译错误,sql,oracle,plsql,Sql,Oracle,Plsql,我试图创建一个触发器来计算每个insert命令的派生属性。然而,我得到编译错误,我不知道哪里是问题 CREATE OR REPLACE TRIGGER NewTrigger BEFORE INSERT ON Dates FOR EACH ROW BEGIN SET :NEW.difference := :NEW.date1 - :NEW.date2; END; 显示错误向我显示以下信息: LINE/COL ERROR -------- -------------------
CREATE OR REPLACE TRIGGER NewTrigger
BEFORE INSERT
ON Dates FOR EACH ROW
BEGIN
SET :NEW.difference := :NEW.date1 - :NEW.date2;
END;
显示错误向我显示以下信息:
LINE/COL ERROR
-------- -----------------------------------------------------------------
1/7 PL/SQL: SQL Statement ignored
1/11 PL/SQL: ORA-00922: missing or invalid option
这不是触发器,而是数据类型。如果从另一个日期减去一个日期,则结果是一个间隔,而不是另一个日期:
CREATE TABLE dates (date1 DATE, date2 DATE, datediff DATE, numdiff NUMBER);
INSERT INTO dates (date1, date2) VALUES (sysdate, sysdate-1);
UPDATE dates SET numdiff = date1 - date2;
1 rows updated
UPDATE dates SET datediff = date1 - date2;
SQL Error: ORA-00932: inconsistent datatypes: expected DATE got DATE JULIAN
因此,如果触发器将间隔存储在一个数字中,它将编译:
CREATE OR REPLACE TRIGGER newtriggernum
BEFORE INSERT ON dates FOR EACH ROW
BEGIN
:new.numdiff := :new.date1 - :new.date2;
END;
/
TRIGGER NEWTRIGGERNUM compiled
如果它将时间间隔存储在日期中,则不会:
CREATE OR REPLACE TRIGGER newtriggerdate
BEFORE INSERT ON dates FOR EACH ROW
BEGIN
:new.datediff := :new.date1 - :new.date2;
END;
/
Error(2,11): PL/SQL: ORA-00922: missing or invalid option
日期的日期类型是什么。差异?一定有什么你没有告诉我们的,因为这应该有效。差异的类型是数字。显然不需要“SET”关键字。FYI-SET是一个SQL*plus命令,而不是PL/SQL。否,它也不会编译为相同的错误消息:-(
CREATE OR REPLACE TRIGGER newtriggerdate
BEFORE INSERT ON dates FOR EACH ROW
BEGIN
:new.datediff := :new.date1 - :new.date2;
END;
/
Error(2,11): PL/SQL: ORA-00922: missing or invalid option