我有一个带有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;
/
答案 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
之后和调用该过程之前。