【问题标题】:SQL PLUS Trigger compilation errorsSQL PLUS 触发编译错误
【发布时间】:2012-12-19 11:40:32
【问题描述】:

我正在尝试创建一个触发器来计算每个插入命令的派生属性。但是我收到编译错误,我不知道问题出在哪里。

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

【问题讨论】:

  • dates.difference 的日期类型是什么?
  • 一定有什么你没有告诉我们的,因为那应该有效。
  • 差异类型是数字
  • 显然不需要“SET”关键字。
  • 仅供参考 - SET 是 SQL*plus 命令,而不是 PL/SQL。

标签: sql oracle plsql


【解决方案1】:

不是触发器,而是数据类型。如果你从另一个日期减去一个日期,结果是一个间隔,而不是另一个日期:

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

【讨论】:

    【解决方案2】:
    CREATE OR REPLACE TRIGGER NewTrigger
    BEFORE INSERT ON Dates FOR EACH ROW
    BEGIN 
        :NEW.difference := :NEW.date1 - :NEW.date2;
    End;
    /
    

    【讨论】:

    • 不,编译时也不会出现同样的错误信息:-(
    猜你喜欢
    • 2010-12-12
    • 2020-04-24
    • 2014-01-04
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多