我只想为检查数据是否已经存在并且无法正常工作的唯一约束设置触发器。请帮助我
DECLARE
V NUMBER;
BEGIN
SELECT COUNT (*)
INTO V
FROM AR_RECEIPTS
WHERE BANK_INSTRUMENT_NO = :BANK_INSTRUMENT;
IF V= 0
THEN
MESSAGE ('Instrument Number Already Exists!');
MESSAGE ('Instrument Number Already Exists!');
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;
答案 0 :(得分:2)
如果您想在用户尝试插入重复的BANK_INSTRUMENT时显示此消息,则您的测试应为IF V > 0
。目前,当目标表中该仪器号不存在时,您会显示一条消息。
请注意,尽管此检查似乎对用户友好-在UI中检查并通知用户,而不是从数据库中获取异常-这并不安全。在多用户环境中,两个用户可以输入相同的号码,全部清除并提交副本。您仍然需要在数据库中实施唯一约束:
alter table ar_receipts add constraint ar_receipts_uk unique (bank_instrument_no);
答案 1 :(得分:0)
这是正确的,现在可以根据要求正常工作...
DECLARE
V NUMBER;
BEGIN
SELECT COUNT (*)
INTO V
FROM AR_RECEIPTS
WHERE BANK_INSTRUMENT_NO = :BANK_INSTRUMENT;
IF V<>'0'
THEN
MESSAGE ('Instrument Number Already Exists!');
MESSAGE ('Instrument Number Already Exists!');
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;
答案 2 :(得分:0)
如果这是一个触发因素,我希望WHERE BANK_INSTRUMENT_NO = :BANK_INSTRUMENT;
应该用WHERE BANK_INSTRUMENT_NO = :NEW.BANK_INSTRUMENT;
如果提供了整个触发器,将会更容易。