0

我正在尝试创建一个触发器以validityplan表中获取值并将其添加到值中以startdate获取表中的值。我已经编写了这个触发器。enddatedblog

我的dblogplan表模式是这样的

desc dblog;
 Name                         Null?    Type
 ---------------------------- -------- -------
 PLANID                       NOT NULL NUMBER
 STARTDATE                             DATE
 ENDDATE                      NOT NULL DATE

desc plan;
 Name                         Null?    Type
 ---------------------------- -------- -------
 PLANID                       NOT NULL NUMBER
 VALIDITY                     NOT NULL NUMBER

默认情况下,列STARTDATE具有SYSDATE值。

CREATE OR REPLACE TRIGGER trg2
BEFORE INSERT ON dblog FOR EACH ROW
DECLARE
   l_startdate date :=  SYSDATE;
   l_enddate date;
   l_validity number;
BEGIN
 SELECT validity INTO l_validity
   FROM plan
  WHERE planid = :NEW.planid;

 l_endate := l_startdate + l_validity;

 SET :NEW.enddate := l_enddate;

END;
/

它显示以下错误:

10/2     PL/SQL: SQL Statement ignored
10/6     PL/SQL: ORA-00922: missing or invalid option

我是在使用错误的概念还是什么?我怎样才能做到这一点?

4

1 回答 1

3

l_startdate SYSDATE;

您还没有声明变量的数据类型SYSDATE是一个内置函数而不是数据类型。

如果要在数据类型声明时分配值,请执行以下操作:

DECLARE
   l_startdate DATE := SYSDATE;

例如,

SQL> set serveroutput on
SQL> DECLARE
  2    start_dt DATE := SYSDATE;
  3  BEGIN
  4    dbms_output.put_line(start_dt);
  5  END;
  6  /
29-SEP-15

PL/SQL procedure successfully completed.

SQL>

UPDATE OP 编辑​​了问题

以下查询将失败:

SELECT validity INTO l_validity from plan where planid=:new.planid;

但是,由于您的触发器是在dblogtable 上定义的,因此您指的是plantable 的 :new 值。

还,

SET :NEW.enddate := l_enddate;

您不需要SET子句,只需执行以下操作:

:NEW.enddate := l_enddate;
于 2015-09-29T04:52:17.900 回答