Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle触发器根据另一个表中的值限制空值_Oracle_Triggers - Fatal编程技术网

Oracle触发器根据另一个表中的值限制空值

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

请给我一个伪触发代码的例子,如何拒绝异常消息空值 在表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
          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;