PL / SQL触发器根据与其他表比较的列的值来防止在一个表中输入

问题描述 投票:0回答:1

我有以下两个表:

TBL_EMPLOYEE

EMP_ID| FIRST_NAME| LAST_NAME|  PPS|        SALARY| JOB_ID| OFFICE_ID| MANAGER_ID| IND_ID
E001    JOHN        KENNEDY     12345ABCDE  90000   J001                            IN01
E002    BILL        CLINTON     12345ABCXE  80000   J002    OF01        E001        IN02
E003    BARAK       OBAMA       18745ABCXE  80000   J002    OF02        E001        IN03
E004    GORGE       BUSH        88745ABCXF  60000   J004    OF04        E002        IN04
E005    GORGE SR.   BUSH        45745ABCXS  70000   J003    OF03        E003        IN04
E006    LYNDON      JOHNSON     85345ABCYT  75000   J004    OF04        E002        IN06

TBL_CUST

CUST_ID| CUST_NAME|     CREATED_DATE| TRUSTED| IND_ID| EMP_ID| CUST_SCONT_ID| CUST_PCONT_ID
C100        ACCENTURE   23-DEC-19       N       IN04    E004                    PA02
C200        PWC         23-DEC-19       N       IN05    E005                    PA03
C300        ANDERSON    23-DEC-19       N       IN03    E003    SA01            PA04
C400        VODAFONE    23-DEC-19       N       IN02    E002    SA03            PA01
C500        GOODMAN     23-DEC-19       N       IN01    E001    SA05            PA05

并且我已经开发了一个PL / SQL触发器,如果​​TBL_CUST中的'IND_ID'与TBL_EMPLOYEE不同,它将阻止插入或更新。 TBL_CUST表的EMP_ID是外键。

CREATE OR REPLACE TRIGGER TRG_check_consistency_of_the_industry
    BEFORE INSERT OR UPDATE 
    ON tbl_cust
    FOR EACH ROW 
DECLARE
    v_industry_type1 varchar2(4);
    v_industry_type2 varchar2(4);
BEGIN
    IF :new.cust_id IS NOT NULL THEN
        v_industry_type1 := :NEW.ind_id;

        SELECT e.ind_id INTO v_industry_type2
        FROM tbl_cust c 
        INNER JOIN tbl_employee e ON c.emp_id = e.emp_id
        WHERE e.emp_id = :new.emp_id;

        IF v_industry_type1 <> v_industry_type2 THEN
            raise_application_error(-20025, 'The industry of the customer is not the same the account manager');
        END IF;
    END IF;
END;

但是当我尝试输入以下内容时:

INSERT INTO tbl_cust(cust_id, cust_name, ind_id, emp_id,cust_pcont_id) VALUES ('C600', 'DISNEY', 'IN03', 'E006', 'PA06');

我收到此错误

Error starting at line : 56 in command -
INSERT INTO tbl_cust(cust_id, cust_name, ind_id, emp_id,cust_pcont_id) VALUES ('C600', 'DISNEY', 'IN03', 'E006', 'PA06')
Error report -
ORA-01403: no data found
ORA-06512: at "TTAPADAR.TRG_CHECK_CONSISTENCY_OF_THE_INDUSTRY", line 8
ORA-04088: error during execution of trigger 'TTAPADAR.TRG_CHECK_CONSISTENCY_OF_THE_INDUSTRY'
plsql triggers sql-update sql-insert plsqldeveloper
1个回答
1
投票

因为您在说:

SELECT e.ind_id INTO v_industry_type2
FROM tbl_cust c 
INNER JOIN tbl_employee e ON c.emp_id = e.emp_id
WHERE e.emp_id = :new.emp_id;

......如果没有要插入新ID的员工,则SELECT将引发NO_DATA_FOUND异常。

您需要做的是处理此异常:

CREATE OR REPLACE TRIGGER TRG_check_consistency_of_the_industry
    BEFORE INSERT OR UPDATE 
    ON tbl_cust
    FOR EACH ROW 
DECLARE
    v_industry_type1 varchar2(4);
    v_industry_type2 varchar2(4);
BEGIN

    IF :new.cust_id IS NOT NULL THEN
        v_industry_type1 := :NEW.ind_id;

        SELECT e.ind_id INTO v_industry_type2
        FROM tbl_cust c 
        INNER JOIN tbl_employee e ON c.emp_id = e.emp_id
        WHERE e.emp_id = :new.emp_id;

        IF v_industry_type1 <> v_industry_type2 THEN
        raise_application_error(-20025, 'The industry of the customer is not the same the account manager');
        END IF;
    END IF;


    -- handle the exception here
    EXCEPTION
        WHEN OTHERS THEN
            NULL; --> DO NOTHING
END;

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.