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