我是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',但这只是一个练习...
任何人都知道如何解决这个问题?
提前致谢。
答案 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,但不执行任何操作。
非常感谢所有帮助过我并向我展示可能性的人!