【问题标题】:Difficulty compiling an AFTER INSERT OR UPDATE trigger难以编译 AFTER INSERT OR UPDATE 触发器
【发布时间】:2018-03-24 07:05:56
【问题描述】:

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

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

以下是将 Salary 字段更新为低、中或高的触发器和过程。

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;
/

【问题讨论】:

    标签: oracle plsql triggers database-trigger


    【解决方案1】:

    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;
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-04
        • 1970-01-01
        • 1970-01-01
        • 2013-03-29
        • 2023-03-18
        • 2019-11-22
        相关资源
        最近更新 更多