我尝试创建触发器以从validity
表中获取plan
的值,并将其添加到startdate
的值以将enddate
转换为dblog
dblog
table.I已经写了这个触发器。
我的plan
和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
它显示以下错误:
{{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;