【问题标题】:plsql complete loop before if statement triggers?if语句触发之前的plsql完整循环?
【发布时间】:2014-01-04 15:31:56
【问题描述】:

因此,对于我当前的项目,我想检查给定的 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 地址是否在任何范围内。我该如何解决这个问题?

【问题讨论】:

  • 在 THEN 子句中设置not_nederlands := 'N'
  • 啊,工作,比我想象的要容易>

标签: oracle loops exception plsql


【解决方案1】:

也许数据库可以完成这项工作,而不是遍历游标:

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;

分享和享受。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多