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完整循环?的主要内容,如果未能解决你的问题,请参考以下文章