Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/11/2007, 15h42   #1
Membre du Club
 
Inscription : avril 2004
Messages : 85
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2004
Messages : 85
Points : 62
Points : 62
Par défaut Procedure stockée DB2

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 :
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
aicfr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2007, 16h54   #2
Membre habitué
 
Inscription : septembre 2004
Messages : 123
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 123
Points : 127
Points : 127
Bonjour,

A priori, même si tu demandes à DB2 de continuer le traitement lors de l'erreur, DB2 a du fermer ton curseur. Donc dans ta boucle, tu fetches sur un curseur fermé d'où ton problème. Tu peux essayer de rajouter la clause WITH HOLD dans la déclaration de ton curseur mais je ne pense pas que cela marchera.

Alex.
alex. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2007, 20h33   #3
Membre du Club
 
Inscription : avril 2004
Messages : 85
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2004
Messages : 85
Points : 62
Points : 62
Non effectivement, cela ne marche pas, mais merci bien pour ta réponse
aicfr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2007, 15h31   #4
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Si tu modifies comme je le montre ci-dessous, ça devrait marcher.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
CREATE PROCEDURE GEOIP()
LANGUAGE SQL
BEGIN
DECLARE V_NEWIP BIGINT;
 
FOR VL AS
 C1 CURSOR FOR
   SELECT IP FROM UTILISATEUR.IP
   DO
 
    Case POSSTR(IP, '.')
     When 0 Then SET V_NewIP = 0;
    Else
     SET V_NewIP =
 	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);
     End Case;
 
 INSERT INTO utilisateur.newip VALUES (IP, V_NEWIP);
END FOR;
 
END
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2007, 10h12   #5
Membre du Club
 
Inscription : avril 2004
Messages : 85
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2004
Messages : 85
Points : 62
Points : 62
Merci beaucoup, je n'avais meme pas pensé à ne selectionner que les adresses IP dans ma table....
aicfr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h27.


 
 
 
 
Partenaires

Hébergement Web