Oracle SQL - 插入前触发器未触发

时间:2017-03-31 14:40:38

标签: oracle triggers

我是Oracle SQL的新手,今天我想尝试一个与'UNIQUE'语句相同的示例触发器。因此,如果特定属性('cityid')已经在数据集中,则触发器应在插入之前进行检查。

问题是我的触发器没有触发!编译工作正常,但没有一个命令正常工作。

就是这样:

CREATE OR REPLACE TRIGGER check_cityid
BEFORE INSERT
    ON city
    FOR EACH ROW
BEGIN

    IF :old.cityid <> :new.cityid THEN
        insert into city (cityid, name, country, province, population, latitude, longitude) values (:new.cityid, :new.name, :new.country, :new.province, :new.population, :new.latitude, :new.longitude);
        DBMS_OUTPUT.PUT_LINE('OK');
    ELSE
        DBMS_OUTPUT.PUT_LINE('The attribute CITYID is already present!');
    END IF;

END;
/

这是我的表'city',其中NAME + COUNTRY + PROVINCE为主键:

SQL> describe city;
 Name                                                  Null?    Typ
 ----------------------------------------------------- -------- -------
 NAME                                                  NOT NULL VARCHAR2(35)
 COUNTRY                                               NOT NULL VARCHAR2(4)
 PROVINCE                                              NOT NULL VARCHAR2(32)
 POPULATION                                                     NUMBER
 LONGITUDE                                                      NUMBER
 LATITUDE                                                       NUMBER
 CITYID                                                         NUMBER(38)
是的,我知道PK应该引用'cityid',但这只是一个练习...

任何人都知道如何解决这个问题?

提前致谢。

1 个答案:

答案 0 :(得分:0)

好吧,我找到了一个合适的解决方案:

CREATE OR REPLACE TRIGGER check_cityid
BEFORE INSERT
    ON city
    FOR EACH ROW
DECLARE
    cityid_new city.cityid%TYPE := 0;
BEGIN

    select cityid into cityid_new from city where cityid = :new.cityid;

    IF cityid_new = :new.cityid THEN
        raise_application_error(-20001, 'FEHLER: Diese CITYID ist bereits vorhanden!');
    END IF;

EXCEPTION

    WHEN NO_DATA_FOUND THEN
    BEGIN
        DBMS_OUTPUT.PUT_LINE('CITYID check OK.');
    END;

END;
/

如果存在行alreday,我正确地得到错误-20001。如果没有这样的CITYID,则触发器会进入EXCEPTION,但不执行任何操作。

非常感谢所有帮助过我并向我展示可能性的人!