我是数据库新手,我知道这是一个简单的问题,但我无法在任何地方找到答案,所以我感谢您的帮助。
我有两张表,每张表都有相同的结构。
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;
然而,这显然没有什么用处。
任何建议都值得赞赏。
您必须在插入语句中指定值。PL/SQL 允许您使用默认绑定变量来引用触发器内更新或插入的行级值,如下所示:
此外,通常最好明确指定列顺序之类的内容,而不是信任表中的列顺序,因为表中的列顺序是可以更改的。