如何在插入触发器之前访问插入语句值?

时间:2016-09-01 12:00:16

标签: oracle plsql triggers

我想编写一个触发器,它将在插入表之前触发,并将检查特定列的范围。这是我的代码

create or replace TRIGGER
ABC_BI_TRIGGER
BEFORE INSERT ON 
TEMP_TABLE
FOR EACH ROW
DECLARE
    maxUID number;
    abcUID number;
BEGIN
    maxUID := 1500;
    select new.ABC_UID into mslUID from dual;
    if mslUID < maxUID THEN
        raise_application_error (-20001, 'NO values available: contact RE');
    END IF;
END;
/

我使用new.ABC_UID的方式不起作用,我是新手。 new.ABC_UID是在ABC_UID列的insert语句中传递的值。 如果您对此问题有任何其他选择,或者您可以在此代码中纠正我,请帮助我。 提前谢谢。

2 个答案:

答案 0 :(得分:3)

摆脱不需要的select

maxUID := 1500;
if :new.ABC_UID < maxUID THEN
    raise_application_error (-20001, 'NO values available: contact RE');
END IF;

如果你确实想要在变量中,因为你需要在其他地方:

maxUID := 1500;
mslUID := :new.ABC_UID;

if mslUID < maxUID THEN
    raise_application_error (-20001, 'NO values available: contact RE');
END IF;

答案 1 :(得分:0)

您的代码会抛出错误。看下面原因的原因?代码的工作版本,如果你想和你的代码一起选择@Horse的解决方案。

Create or replace TRIGGER ABC_BI_TRIGGER
BEFORE INSERT ON TEMP_TABLE
FOR EACH ROW
DECLARE
    maxUID number;
    abcUID number;  ---Redundant
    mslUID number;  ---Not declared in your code.

BEGIN
    maxUID := 1500;

    mslUID := :new.ABC_UID; --abc_uid is the column of table Temp_table         

    If mslUID < maxUID THEN
        raise_application_error (-20001, 'NO values available: contact RE');
    END IF;
END;
/