lasnoufle La seule et unique! | Bonjour,
J'ai une p'tite question sur une de mes requetes. Pour le moment elle marche mais c'est moche et ca garantit pas le résultat, mais j'arrive pas trop à tourner ca autrement, donc je voudrais juste voir si quelqu'un a une idée pour améliorer ca.
J'isole et je simplifie l'endroit qui m'intéresse, c'est dans une requete plus grande:
Code :
- SELECT i.gfid, MDSYS.SDO_UTIL.EXTRACT(i.gfgeom,i.idx,0) AS geometry
- FROM ( SELECT tb.gfid, dt.id idx, tb.gfgeom
- FROM ( SELECT gf.id as gfid, SDO_GEOM.SDO_INTERSECTION(:new.geometry,gf.geometry,0.005) as gfgeom
- FROM geo_features gf
- ) tb
- JOIN dummy_table dt ON SDO_UTIL.GETNUMELEM(gfgeom)>= ID
- WHERE gmgeom IS NOT NULL
- ) i
|
Ce que je veux faire: SDO_GEOM.SDO_INTERSECTION génère potentiellement une collection, et j'ai besoin de splitter la collection en éléments simples.
Pour cela, j'utilise MDSYS.SDO_UTIL.EXTRACT, qui prend en paramètres la collection et l'index de l'élément à extraire de la collection, et retourne l'élément indiqué.
Bon.
Il me faut extraire tous les éléments donc entre les deux fonctions, il me faut générer une table qui aura, pour chaque élément d'une collection, une ligne avec la collection elle-meme et l'index de l'élément.
Par exemple si la requete interne retourne une collection (je schématise) [elem1, elem2, elem3], il faut que je génère une table:
IDX GFGEOM
1 [elem1, elem2, elem3]
2 [elem1, elem2, elem3]
3 [elem1, elem2, elem3]
Ma solution (moche) est d'utiliser une autre table (dummy_table dans la requete) qui se contente d'énumérer les entiers positifs, et de faire un non-equijoin dessus basé sur le nombre d'éléments de la collection (SDO_UTIL.GETNUMELEM(gfgeom)>= ID).
Comme je disais, ca marche bien.
Mais comme je disais, je trouve ca moche au possible.
Et conceptuellement, ca me gene parce que dummy_table a un nombre fini d'éléments, donc si jamais la collection dépasse ce nombre, le résultat de la requete sera faux. Bon, en pratique, suffit de placer ca assez haut pout que la base de données plante avant de pouvoir générer une collection suffisament grosse pour matcher la limite, comme ca je suis "couvert".
Bref.
Des idées?
Merci d'avance. ---------------
C'était vraiment très intéressant.
|