Bonjour,

Je suis en train de réaliser une procedure afin de géocaliser des adresses ip (en utilisant les données fournies par maximind.com). Mon problème est que ma colonne (IP) ne contient pas forcement que des adresses IP (ces données sont des log apache). J'aimerais pouvoir continuer mon traitement même si le select ne peut pas être effectuer (j'obtient un SQLSTATE = 22011'). Pour cela, j'ai utilisé DECLARE error_ip CONDITION FOR SQLSTATE '22011' et DECLARE CONTINUE HANDLER FOR error_ip; mais cela ne marche pas. J'obtiens une erreur d'ouverture de curseur.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
CREATE PROCEDURE GEOIP()
LANGUAGE SQL
BEGIN
DECLARE v_ip VARCHAR(20);
DECLARE v_newip BIGINT;
DECLARE error_ip CONDITION FOR SQLSTATE '22011';
 
FOR_LOOP: FOR EACH_ROW AS C1 CURSOR FOR
	SELECT IP,
	cast(substr(IP, 1, posstr(IP, '.')-1) as BIGINT)*16777216 +
	cast(substr(substr(IP, posstr(IP, '.')+1), 1, posstr(substr(IP, posstr(IP, '.')+1), '.')-1) as BIGINT)*65536  +
	cast(substr(substr(substr(IP, posstr(IP, '.')+1), posstr(substr(IP, posstr(IP, '.')+1), '.')+1), 1, posstr(substr(substr(IP, posstr(IP, '.')+1), posstr(substr(IP, posstr(IP, '.')+1), '.')+1), '.')-1) as BIGINT)*256  +
	cast(substr(substr(substr(IP, posstr(IP, '.')+1), posstr(substr(IP, posstr(IP, '.')+1), '.')+1), posstr(substr(substr(IP, posstr(IP, '.')+1), posstr(substr(IP, posstr(IP, '.')+1), '.')+1), '.')+1) as BIGINT)  as part4
	FROM UTILISATEUR.IP
DO
        insert into utilisateur.newip values (EACH_ROW.IP, EACH_ROW.part4);
END FOR;
END