Aloha
J'ai créé une requête pour effectuer différents calculs sur des intersections d'objets :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
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.