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

but5z9lq  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(139)

我是数据库的新手,我知道这是一个简单的问题,但我在任何地方都找不到答案,所以我感谢你的帮助。
我有两个表,每个表都有相同的结构。

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

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

然后我尝试创建这个触发器,它将在每次插入或更新table 1时向table 2插入一个新行。关键是要使表2成为表1中更改的历史:

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(CaseDate,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;

然而,这显然是没有用的。
任何建议在所有赞赏。

d8tt03nd

d8tt03nd1#

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

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;

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

相关问题