pl / sql从开始日期开始获取结束日期

时间:2015-09-29 04:41:46

标签: oracle plsql triggers database-trigger

我尝试创建触发器以从validity表中获取plan的值,并将其添加到startdate的值以将enddate转换为dblog dblog table.I已经写了这个触发器。

我的plandesc 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

它显示以下错误:

{{1}}

我使用错误的概念还是什么?我怎么能这样做?

1 个答案:

答案 0 :(得分: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>

更新 OP编辑了问题

以下查询将失败:

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

因为你的触发器是在dblog表上定义的,所以你指的是plan表的新值。

此外,

SET :NEW.enddate := l_enddate;

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

:NEW.enddate := l_enddate;