As funções geométricas de aninhamento, em conjunto, podem apresentar problemas quando a função aninhada interna retornar um tipo de figura geométrica não aceito pela função de chamada externa. Esse problema poderá ser solucionado se o tipo de figura geométrica da função aninhada externa puder ser convertido em um tipo aceitável pela função de chamada externa.
O tipo de figura geométrica das funções que retornam o supertipo ST_Geometry pode ser convertido num subtipo que use a função Tratar (TREAT). Por exemplo, a função ST_Union retorna valores de ST_Geometry. Quando ST_Union é aninhada na função ST_PointOnSurface, ST_PointOnSurface retorna o seguinte erro:
SQL00440N Nenhuma função com o nome "ST_POINTONSURFACE" que tenha argumentos compatíveis foi encontrada no caminho da função. SQLSTATE=42884
A função ST_PointOnSurface considera o tipo de figura geométrica ST_Polygon ou ST_MultiPolygon, mas não o ST_Geometry retornado por ST_Union, embora o valor retornado pela função ST_Union seja ST_MultiPolygon. Portanto, nesse caso, é necessário converter o tipo de figura geométrica da função ST_Union em ST_MultiPolygon.
Por exemplo, se a tabela COUNTIES fosse auto-anexada pela união de sua coluna de polígono COUNTY, a função Treat deveria ser aplicada ao resultado da função ST_Union para converter o tipo ST_Geometry em ST_MultiPolygon, antes que a função ST_PointOnSurface pudesse ser aplicada.
SELECT ST_Astext(ST_PointOnSurface( TREAT ( ST_Union(c1.county, c2.county) AS ST_MultiPolygon))) FROM counties AS c1, counties AS c2;
Se a função ST_Union retornar um valor de ST_MultiPolygon, a função Treat a converterá num tipo de dado ST_MultiPolygon. Se a função ST_Union não retornar um valor ST_MultiPolygon, a função Tratar retornará um erro de tempo de execução.
Para obter mais informações sobre o tratamento de um subtipo, consulte a Referência de SQL.
Utilize a função ST_GeometryN para converter um elemento de uma coleção de figuras geométricas em uma figura geométrica básica requerida pela função de chamada externa.
Por exemplo, o valor retornado pela função ST_Union é sempre uma coleção de figuras geométricas retornada como uma ST_Geometry. Utilize a função Treat para converter o tipo ST_Geometry em um subtipo, que pode ser um dos seguintes: ST_MultiPoint, ST_MultiLineString, ST_MultiPolygon, ST_GeomCollection, ST_MultiCurve ou ST_MultiSurface. Aplique a função ST_GeometryN à saída da função Treat que está convertendo a coleção de figuras geométricas em uma figura geométrica básica.
Por exemplo, para utilizar a função ST_ExteriorRing nos resultados da função ST_Union do exemplo da seção anterior, utilize primeiro a função ST_GeometryN para extrair um elemento de polígono.
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;
O cálculo é necessário somente ao se passar, na hierarquia, de um supertipo para um subtipo. Para obter mais informações sobre o tratamento de subtipos, consulte a Referência de SQL.