if语句触发之前的plsql完整循环?

Posted

技术标签:

【中文标题】if语句触发之前的plsql完整循环?【英文标题】:plsql complete loop before if statement triggers? 【发布时间】: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' 啊,工作,比我想象的要容易> 【参考方案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;

分享和享受。

【讨论】:

以上是关于if语句触发之前的plsql完整循环?的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL:if then else语句段

字符串作为PLSQL中IF语句中的条件

高中数学 基本算法语句 while 和if 的双循环

如何在mysql触发器中声明If语句

有对C语言熟悉的吗?我对if语句有点小小的疑问,请您解答。。

PHP - IF 语句在 While 循环中始终为真