L'imbrication de fonctions peut causer des difficultés si la fonction imbriquée appelée renvoie un type de géométrie non accepté par la fonction imbriquée appelante. Cela peut être résolu si le type de géométrie renvoyé par la fonction imbriquée appelée peut être converti en un type de géométrie acceptable par la fonction imbriquée appelante.
Le type de géométrie des fonctions qui renvoient le supertype ST_Geometry peut être converti en sous-type à l'aide de la fonction Treat. Par exemple, la fonction ST_Union renvoie des valeurs de type ST_Geometry. Lorsque ST_Union est imbriquée dans la fonction ST_PointOnSurface, cette dernière renvoie l'erreur suivante :
SQL00440N Aucune fonction appelée "ST_POINTONSURFACE" et ayant des arguments compatibles n'a été trouvé dans le chemin de fonctions. SQLSTATE=42884
La fonction ST_PointOnSurface accepte les types de géométries ST_Polygon et ST_MultiPolygon, mais pas le type ST_Geometry renvoyé par la fonction ST_Union, même si la valeur renvoyée par ST_Union est ST_MultiPolygon. Par conséquent, dans ce cas, il est nécessaire de convertir le type de géométrie de la fonction ST_Union en ST_MultiPolygon.
Par exemple, si la table COUNTIES fait l'objet d'une jointure avec elle-même par union de sa colonne de polygone COUNTY, la fonction Treat doit être appliquée au résultat de la fonction ST_Union pour convertir le type ST_Geometry en ST_MultiPolygon avant utilisation de la fonction ST_PointOnSurface.
SELECT ST_Astext(ST_PointOnSurface( TREAT ( ST_Union(c1.county, c2.county) AS ST_MultiPolygon))) FROM counties AS c1, counties AS c2;
Si la fonction ST_Union renvoie une valeur ST_MultiPolygon, la fonction Treat la convertit pour qu'elle prenne le type de données ST_MultiPolygon. Si la fonction ST_Union ne renvoie pas une valeur ST_MultiPolygon, la fonction Treat renvoie une erreur d'exécution.
Pour plus d'informations concernant le traitement des sous-types, reportez-vous au manuel SQL Reference.
La fonction ST_GeometryN convertit un élément d'une collection de géométries en une géométrie de base requise par la fonction imbriquée appelante.
Par exemple, la valeur renvoyée par la fonction ST_Union est toujours une collection de géométries renvoyée en tant que ST_Geometry. Utilisez la fonction Treat pour convertir le type ST_Geometry en l'un des sous-types suivants : ST_MultiPoint, ST_MultiLineString, ST_MultiPolygon, ST_GeomCollection, ST_MultiCurve ou ST_MultiSurface. Utilisez ensuite la fonction ST_GeometryN à la sortie de la fonction Treat pour convertir la collection de géométries en géométrie de base.
Par exemple, pour pouvoir utiliser la fonction ST_ExteriorRing sur les résultats de la fonction ST_Union obtenus dans l'exemple de la section précédente, commencez par utilisez la fonction ST_GeometryN pour extraire un élément polygone.
SELECT ST_AsText(ST_ExteriorRing(ST_GeometryN( TREAT ( ST_Union(c1.county, c2.county) AS ST_MultiPolygon ), 1))) FROM counties AS c1, counties AS c2;
Cette opération de transtypage (cast) n'est nécessaire que lorsque vous passez d'un supertype à un sous-type de la hiérarchie. Pour plus d'informations concernant le traitement des sous-types, reportez-vous au manuel SQL Reference.