2011-03-02 155 views
3

全部, 我只是试图创建一个触发器,将从TABLE EMP中选择一个完整的记录,并将其插入TABLE EMP_ARCHIVE上的UPDATE尝试(顾名思义,EMP_ARCHIVE表只是一个历史记录表来存储邮件EMP表中所做的更改)。两个表都有相同的字段/列。以下是我尝试创建的触发器。我知道有什么不对,但无法弄清楚。它抛出错误的“(”以下INSERT命令任何帮助,将不胜感激 原谅我,如果有一些根本性的错误,因为我是一个新手,这些ORACLE触发器INSERT更新

CREATE OR REPLACE TRIGGER Save_EMP_Changes 
BEFORE UPDATE ON EMP 
FOR EACH ROW 
BEGIN 
    INSERT INTO EMP_ARCHIVE 
    (
     emp_id, emp_name, 
     emp_age, emp_sex, 
     emp_active 
    ) 
    SELECT 
     :old.emp_id, :old.emp_name, 
     :old.emp_age, :old.emp_sex, 
     :old.emp_active 
    FROM EMP 
    WHERE emp_id = :old.emp_id 
END; 
+0

您的语法错误是Select需要围绕它的括号。虽然,a_horse_with_no_name提供了正确的答案。你根本不需要SELECT。 – Mikezx6r 2011-03-02 19:54:01

+2

包含实际的错误消息(ORA-xxxxx错误号和错误文本)通常会有所帮助。有时候错误会跳出来,但没有其他时间,错误是非常有用的信息。 – 2011-03-02 19:54:26

回答

6

无需从表中选择。:

 
CREATE OR REPLACE TRIGGER Save_EMP_Changes 
BEFORE UPDATE ON EMP 
FOR EACH ROW 
BEGIN 
    INSERT INTO EMP_ARCHIVE 
    (
     emp_id, emp_name, 
     emp_age, emp_sex, 
     emp_active 
    ) 
    VALUES 
    ( :old.emp_id, :old.emp_name, 
     :old.emp_age, :old.emp_sex, 
     :old.emp_active 
    ); 
END; 

BTW:在甲骨文11,你可以完全自动完成这个由这些表创建一个闪回存档中没有触发或任何其他麻烦

+0

在11g之前,Workspace Manager也可用于自动跟踪历史信息。 – 2011-03-02 19:54:59

+0

@Justin:是的,但查询信息并不容易。使用闪回档案你可以做一个'SELECT * FROM some_table AS TIMESTAMP TIMESTAMP'2005-06-28 14:38:12'' – 2011-03-02 19:59:50

+0

你在INSERT之后加了分号吗?你用哪个工具运行这个?在SQLPlus中,你需要在一行中用'/'来终止它。在你使用SQL * Plus的时候复制和粘贴(作为编辑的问题)可能是一个好主意。 – 2011-03-02 20:14:06

0

我知道这是一个有点老问题,但是想通我把。另一个想法,为其他任何人com在这个问题上,就像我刚才那样。在过去,我在做同样的存档过程时做了以下事情。

CREATE OR REPLACE TRIGGER Save_EMP_Changes 
BEFORE UPDATE ON EMP 
FOR EACH ROW 
BEGIN 
    INSERT INTO EMP_ARCHIVE 
    (
     emp_id, emp_name, 
     emp_age, emp_sex, 
     emp_active, revision_cnt 
    ) 
    SELECT 
     :old.emp_id, :old.emp_name, 
     :old.emp_age, :old.emp_sex, 
     :old.emp_active, nvl(max(revision_cnt)+1, 1) 
    FROM EMP 
    WHERE emp_id = :old.emp_id 
END; 

HTH others。