Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 29/01/2008, 10h53   #1
Nouveau Membre du Club
 
Avatar de H.ile
 
Architecte de système d'information
Inscription : janvier 2008
Messages : 107
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Macao

Informations professionnelles :
Activité : Architecte de système d'information

Informations forums :
Inscription : janvier 2008
Messages : 107
Points : 37
Points : 37
Par défaut [Oracle Spatial 10] Division par Zéro !

Aloha
J'ai créé une requête pour effectuer différents calculs sur des intersections d'objets :
Code :
1
2
3
4
5
6
7
8
9
10
11
select parc.IDENT, pos.GID, pos.ZONAGE_U as "ZONAGE", pos.ZONE_URG as "ZONE", substr(parc.IDENT,1,3) as "INSEE",
substr(parc.IDENT,7,2) as "SECTION", substr(parc.IDENT,9,4) AS "NUMERO",
round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,pos.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(parc.GEOMETRY,0.005)))*100,2) " SURFACE D'INTERSECTION (%)",
round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,pos.GEOMETRY, 0.005),0.005))/1000000,2) " SURFACE D'INTERSECTION (m2)",
round(SDO_GEOM.SDO_AREA(parc.GEOMETRY, 0.005)/1000000,2) "SURFACE PARCELLE en m2",
round(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,pos.GEOMETRY,0.005),0.1)/1000,4) "P INT en M",
round(((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,pos.GEOMETRY, 0.005),0.005))
/(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,pos.GEOMETRY,0.005),0.1),0.1)),4) "S INT / P INT"    from A_REIMS.PP_RZPOS pos, A_REIMS.PCI_PARC parc, A_REIMS.PP_EMCTR empctr
    where empctr.numero_e='10'
	and SDO_FILTER(parc.GEOMETRY,empctr.GEOMETRY)='TRUE'
	and SDO_ANYINTERACT(pos.GEOMETRY,parc.GEOMETRY)='TRUE';
Cependant, comme mon indicateur S INT / P INT est un rapport, et que mon filtre est anyinteract, j'ai un problème de division par 0.
J'ai essayé de modifier ma requête en :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT parc.IDENT, zpos.GID, zpos.ZONAGE_U AS "ZONAGE", zpos.ZONE_URG AS "ZONE", substr(parc.IDENT,1,3) AS "INSEE",
substr(parc.IDENT,7,2) AS "SECTION", substr(parc.IDENT,9,4) AS "NUMERO",
round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(parc.GEOMETRY,0.005)))*100,2) " SURFACE D'INTERSECTION (%)",
round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY, 0.005),0.005))/1000000,2) " SURFACE D'INTERSECTION (m2)",
round(SDO_GEOM.SDO_AREA(parc.GEOMETRY, 0.005)/1000000,2) "SURFACE PARCELLE en m2",
round(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY,0.005),0.1)/1000,4) "P INT en M",
round(((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY, 0.005),0.005))
/(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY,0.005),0.1),0.1)),4) "S INT / P INT"
    FROM A_REIMS.PP_RZPOS zpos, A_REIMS.PCI_PARC parc, A_REIMS.PP_EMCTR empctr
    WHERE empctr.numero_e='10'
	AND SDO_FILTER(parc.GEOMETRY,empctr.GEOMETRY)='TRUE'
	AND SDO_RELATE(zpos.GEOMETRY,parc.GEOMETRY,'mask=inside OR coveredby OR overlabdyintersect OR equal querytype=WINDOW')<>'FALSE';
Mais là çà n'a pas l'air de mieux fonctionner puisqu'il semble qu'une parenthèse manque à l'appel, et si j'enlève mon S INT / P INT, la requête prend des plombes à tourner.

D'avance merci à ceux qui m'aideront soit à debugger, soit à trouver une voie pour obtenir une requête qui tourne.

----------
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
/*Rq pour créer les collection */
SELECT parc.IDENT, zpos.GID, zpos.ZONAGE_U AS "ZONAGE", zpos.ZONE_URG AS "ZONE", substr(parc.IDENT,1,3) AS "INSEE",
substr(parc.IDENT,7,2) AS "SECTION", substr(parc.IDENT,9,4) AS "NUMERO",
 
round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(parc.GEOMETRY,0.005)))*100,2) " SURFACE D'INTERSECTION (%)",
 
round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY, 0.005),0.005))/1000000,2) " SURFACE D'INTERSECTION (m2)",
 
round(SDO_GEOM.SDO_AREA(parc.GEOMETRY, 0.005)/1000000,2) "SURFACE PARCELLE en m2",
 
round(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY,0.005),0.1)/1000,4) "P INT en M",
 
round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY, 0.005),0.005))
/(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY,0.005),0.1)),4) "S INT / P INT",
 
SDO_RELATE(zpos.GEOMETRY,parc.GEOMETRY,'mask=DETERMINE querytype=WINDOW') AS "RELATION ZONEPOS_PARCELLE"
 
 
    FROM A_REIMS.PP_RZPOS zpos, A_REIMS.PCI_PARC parc, A_REIMS.PP_EMCTR empctr
    WHERE empctr.numero_e='10'
	AND SDO_FILTER(parc.GEOMETRY,empctr.GEOMETRY)='TRUE'
	AND (SDO_RELATE(zpos.GEOMETRY,parc.GEOMETRY,'mask=contains querytype=WINDOW')='TRUE'
        OR SDO_RELATE(zpos.GEOMETRY,parc.GEOMETRY,'mask=covers querytype=WINDOW')='TRUE'
        OR SDO_RELATE(zpos.GEOMETRY,parc.GEOMETRY,'mask=overlapbdyintersect querytype=WINDOW')='TRUE'
        OR SDO_RELATE(zpos.GEOMETRY,parc.GEOMETRY,'mask=equal querytype=WINDOW')='TRUE');
Après debuggage et retour sur les étapes, la requête ci dessus tourne bien.
H.ile 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 12h55.


 
 
 
 
Partenaires

Hébergement Web