如果语句触发,plsql完成循环?

时间:2014-01-04 15:31:56

标签: oracle loops exception plsql

因此,对于我当前的项目,我想检查给定的IP地址是否是有效的IP地址。我通过检查有效IP范围的表​​来完成此操作。

CREATE OR REPLACE TRIGGER reactie_check
BEFORE INSERT OR UPDATE ON reactie FOR EACH ROW   
  DECLARE
    ipadres        NUMBER(20);
    fromipnr       NUMBER(20);
    toipnr         NUMBER(20);

    CURSOR fromtoip IS
      SELECT fromip, toip
        FROM dutchip;

    niet_nederlands EXCEPTION;
    not_nederlands VARCHAR2(1);   
  BEGIN

    ipadres := IPTOINT(:new.ipadres);
    dbms_output.put_line(ipadres);

    FOR cc IN fromtoip
    LOOP
      fromipnr := IPTOINT(cc.fromip);
      toipnr := IPTOINT(cc.toip);

      IF ipadres BETWEEN fromipnr AND toipnr THEN
        dbms_output.put_line('TRUE');
        EXIT;
      ELSE
        not_nederlands := 'Y';         
      END IF;
    END LOOP;

    IF not_nederlands = 'Y' THEN
      RAISE niet_nederlands;
    END IF;

    EXCEPTION WHEN niet_nederlands THEN
    raise_application_error(-20000, 'IP address ' || :new.ipadres || ' is not dutch.');       
  END;
/

我的问题是插入的IP地址的正确IP范围是在DUTCHIP表的中间。因此,当它检查IP地址是否在第一个IP范围内时,它会将not_nederlands置于'Y',而不是继续查看IP地址是否在任何范围内。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

可能数据库可以完成工作,而不是遍历游标:

CREATE OR REPLACE TRIGGER REACTIE_CHECK
  BEFORE INSERT OR UPDATE
  ON REACTIE
  FOR EACH ROW
DECLARE
  nCount          NUMBER;
BEGIN
  SELECT COUNT(*)
    INTO nCount
    FROM DUTCHIP i
    WHERE IPTOINT(:new.IPADRES) BETWEEN IPTOINT(i.FROMIP)
                                    AND IPTOINT(i.TOIP);

  IF nCount = 0 THEN
    raise_application_error(-20000, 'IP address ' || :new.IPADRES ||
                                    ' is not dutch.');
  END IF;
END REACTIE_CHECK;

分享并享受。

相关问题