尝试创建触发器时出现 Oracle 错误

问题描述 投票:0回答:1

我是数据库新手,我知道这是一个简单的问题,但我在任何地方都找不到答案,所以我很感谢您的帮助。

我有 2 张表,每张表的结构都相同。

Table1
CaseNum Number(9,0)
CaseStat Number(5,0)
OpenDate Date

Table2
CaseNum Number(9,0)
CaseStat Number(5,0)
OpenDate Date

然后我尝试创建这个触发器,每次插入或更新 table1 时,它将在 table2 中插入一个新行。重点是让 Table2 成为 table1 的变化历史:

CREATE OR REPLACE TRIGGER TABLE1_HIST
AFTER INSERT OR UPDATE ON TABLE1
FOR EACH ROW

BEGIN
   INSERT INTO TABLE2
   VALUES (CaseNum, CaseStat, sysdate);
END;

当我尝试创建它时,出现以下错误:

Error(2,3): PL/SQL: SQL Statement ignored
Error(3,20): PL/SQL: ORA-00984: column not allowed here

但是我已经检查并重新检查了列类型,在我看来它们都是相同的。

问题是,当我替换 VALUES (CaseNum、CaseStat、sysdate) 时;使用硬编码数字,它允许我创建触发器!

这有效:

CREATE OR REPLACE TRIGGER TABLE1_HIST
AFTER INSERT OR UPDATE ON TABLE1
FOR EACH ROW

BEGIN
   INSERT INTO TABLE2
   VALUES (123456789, 12345, sysdate);
END;

但是,这显然没有用。

如有任何建议,我们将不胜感激。

database oracle triggers ddl
1个回答
0
投票

您必须在插入语句中指定values。 PL/SQL 允许您使用默认绑定变量来引用触发器内更新或插入的行级值,如下所示:

CREATE OR REPLACE TRIGGER TABLE1_HIST
AFTER INSERT OR UPDATE ON TABLE1
FOR EACH ROW

BEGIN
   INSERT INTO TABLE2 (casenum, casestat, opendate)
   VALUES (:new.casenum, :new.casestat, sysdate);
END;

此外,通常最好明确指定列顺序等内容,而不是信任表中的列顺序,因为表中的列顺序是可以更改的。

© www.soinside.com 2019 - 2024. All rights reserved.