PLSQL触发器编译错误

PLSQL trigger compilation error

PLSQL 触发器创建时出现编译错误,我无法更新 table。

create or replace trigger dis_salary_changes
before update of Salary on system.emp
for each row
when (new.Eno in('E1','E2','E3','E4','E5'))
declare
    sal_diff integer;
    begin
        sal_diff := :new.salary - :old.salary;
        dbms_output.put_line('Old Salary= '|| :old.Salary);
        dbms_output.put_line('New Salary= '|| :new.Salary);
        dbms_output.put_line('Salary difference= '|| :sal_diff);
    end;
/

除一些问题外,触发器或多或少是可以的。

首先,不要将 SYSTEM 架构用于您的 业务 。创建另一个用户并在那里测试您的技能(或者,使用预安装的其中一个,例如 SCOTTHR,如果它们在那里)。如果您继续在 SYSTEM.

中工作,您可能会搞砸数据库

根据您的代码,唯一的语法错误出现在最后一个 DBMS_OUTPUT.PUT_LINE 调用中 - 删除 SAL_DIFF 变量前面的冒号:

CREATE OR REPLACE TRIGGER dis_salary_changes
   BEFORE UPDATE OF Salary
   ON SYSTEM.emp
   FOR EACH ROW
   WHEN (new.Eno IN ('E1',
                     'E2',
                     'E3',
                     'E4',
                     'E5'))
DECLARE
   sal_diff   INTEGER;
BEGIN
   sal_diff := :new.salary - :old.salary;
   DBMS_OUTPUT.put_line ('Old Salary= ' || :old.Salary);
   DBMS_OUTPUT.put_line ('New Salary= ' || :new.Salary);
   DBMS_OUTPUT.put_line ('Salary difference= ' || :sal_diff);
                                                  ^
                                                  remove it
END;
/

此外,一旦计算出差异,您就不会对该信息做任何事情。是故意的吗?

create or replace trigger dis_SAL_changes
before update of SAL on emp
for each row
when (new.EMPNO in('E1','E2','E3','E4','E5'))
declare
    SAL integer;
    begin
        SAL := :new.SAL - :old.SAL;
        dbms_output.put_line('Old SAL= '|| :old.SAL);
        dbms_output.put_line('New SAL= '|| :new.SAL);
        dbms_output.put_line('SAL difference= '|| :SAL);
    end;

TRIGGER DIS_SAL_CHANGES 已编译