Oracle触发器根据另一个表中的值限制空值
请给我一个伪触发代码的例子,如何拒绝异常消息空值 在表1的第1列中,基于表2的第2列中的值。Oracle触发器根据另一个表中的值限制空值,oracle,triggers,Oracle,Triggers,请给我一个伪触发代码的例子,如何拒绝异常消息空值 在表1的第1列中,基于表2的第2列中的值。 Oracle 11g您需要类似以下内容的触发器: CREATE OR REPLACE TRIGGER TRG_NAME BEFORE INSERT OR UPDATE ON TABLE1 FOR EACH ROW WHEN ( COLUMN1 IS NULL ) DECLARE V_CNT NUMBER := 0; BEGIN SELECT
Oracle 11g您需要类似以下内容的触发器:
CREATE OR REPLACE TRIGGER TRG_NAME BEFORE
INSERT OR UPDATE ON TABLE1
FOR EACH ROW
WHEN ( COLUMN1 IS NULL )
DECLARE
V_CNT NUMBER := 0;
BEGIN
SELECT
COUNT(1)
INTO V_CNT
FROM
TABLE2
WHERE COLUMN2....; -- YOUR CONDITION, IF TRUE THEN NULL IN COLUMN1 WILL NOT BE ALLOWED
IF V_CNT > 0 THEN
RAISE; -- RAISE ERROR IF V_CNT IS NOT ZERO
END IF;
END TRG_NAME;
/
干杯 为什么不将该列定义为NOTNULL并创建一个外键?@a_horse_with_no_name-问题标题:Oracle触发器根据另一个表的值限制NULL值。这意味着,如果我理解正确,有时它可以为null。@VBokšIć:那么一个带有外键的可为null的列就可以了——关键的一点是,这听起来很像是试图用触发器模拟外键。
CREATE OR REPLACE TRIGGER TR_n00b
AFTER INSERT
ON table1
FOR EACH ROW
DECLARE
CURSOR c_column2 (something1 in number) --here you get the value of column2 from table2
IS
SELECT column2
FROM table2
where something = :something1;
v_column2 number;
BEGIN
open c_column2(table1.something1); -- here you can send some parameter to get the column2 value
fetch c_column2 into v_column2;
close c_column2;
if v_column2 < 5 and :new.column1 is null THEN
/*this checks the value of column2 and the value of colum1 and if both of this are
true then you will rise the error*/
RAISE_APPLICATION_ERROR( -20001,
'Column1 of table11 can not be null if column2 is smaller than 5' );
END IF;
END;