难以编译AFTER INSERT或UPDATE触发器

时间:2018-03-23 22:36:09

标签: oracle plsql triggers database-trigger

我有一个带有SALARY字段的EMPLOYEE表。我正在使用Oracle SQL开发人员。我想写一个触发器,这样当有人在EMPLOYEE表中更新薪水时,它会将EMPLOYEE_SALARIES表中的Salary字段更新为低,中,高。这是第二张表。

CREATE TABLE Employee_Salaries(
Ssn CHAR(9) NOT NULL,
Salary VARCHAR(10),
Log_Date DATE
);

这是将薪资字段更新为低,中或高的触发器和过程。

CREATE OR REPLACE PROCEDURE salaryType(x IN NUMBER, y OUT VARCHAR) IS
BEGIN
    IF x >= 60000 THEN y := 'HIGH';
    ELSIF (x >= 40000 AND x <= 60000) THEN y := 'MEDIUM';
    ELSE y := 'LOW'; 
    END IF;
END salaryType;
/

我在此触发器上遇到编译器错误。请告诉我我做错了什么或者我错过了什么。

CREATE OR REPLACE TRIGGER salary1
    AFTER INSERT OR UPDATE ON Employee
    FOR EACH ROW
BEGIN
    DECLARE
        salaryRank VARCHAR(10) := ' ';
    salaryType(:new.Salary, salaryRank); 
    INSERT INTO Employee_Salaries(Ssn, Salary, Log_Date) VALUES (:new.Ssn, salaryRank, SYSDATE);
END;
/

2 个答案:

答案 0 :(得分:2)

Declaration Part位置错误(应该在BEGIN之前和{TRIGGER标题的FOR EACH ROW声明之后),请按以下步骤操作:

CREATE OR REPLACE TRIGGER salary1
    AFTER INSERT OR UPDATE ON Employee
    FOR EACH ROW
DECLARE
        salaryRank VARCHAR(10) := ' ';      
BEGIN
    salaryType(:new.Salary, salaryRank);
    INSERT INTO Employee_Salaries(Ssn, Salary, Log_Date) VALUES (:new.Ssn, salaryRank, SYSDATE);
END;

答案 1 :(得分:0)

触发器中的关键字BEGIN位于错误的位置。应该在DEFINE块之后;也就是说,在您声明salaryrank之后和调用该过程之前。