Oráculo 18c:
Em um post relacionado, demonstrei como usar a função GetVertices() e a função Table() para extrair os vértices de uma linha SDO_GEOMETRY:
Selecione os vértices de linha SDO_GEOMETRY como linhas
select
a.line_id, b.id as vertex_id, b.x, b.y
from
a_sdo_geometry_tbl a,
table(sdo_util.getvertices(a.shape)) b --<<--Here
LINE_ID VERTEX_ID X Y
---------- ---------- ---------- ----------
1 1 671539.685 4863324.18
1 2 671595.050 4863343.17
1 3 671614.014 4863350.34
1 4 671622.204 4863353.53
2 1 71534.5567 4863119.99
2 2 671640.738 4863157.13
2 3 671684.862 4863172.02
Como exercício de aprendizado, quero criar minha própria versão da função GetVertices() usando PL/SQL.
Estou aberto a ideias sobre que tipo de mecanismo usar; qualquer um dos seguintes seria bom:
- SQL básico
- Cláusula MODEL
- Função personalizada
O ponto é, eu quero aprender como extrair os vértices e colocá-los em uma coluna de tabela aninhada em uma consulta, assim como a função GetVertices() faz.
Esta função retorna um objeto de MDSYS.VERTEX_SET_TYPE, que consiste em uma tabela de objetos de MDSYS.VERTEX_TYPE. O Oracle Spatial and Graph define o tipo VERTEX_SET_TYPE como:
CREATE TYPE vertex_set_type as TABLE OF vertex_type;
O Oracle Spatial and Graph define o tipo de objeto VERTEX_TYPE como:
CREATE TYPE vertex_type AS OBJECT (x NUMBER, y NUMBER, z NUMBER, w NUMBER, v5 NUMBER, v6 NUMBER, v7 NUMBER, v8 NUMBER, v9 NUMBER, v10 NUMBER, v11 NUMBER, id NUMBER);
Nota: Os tipos VERTEX_SET_TYPE e VERTEX_TYPE destinam-se ao uso apenas pelo Oracle. Não use esses tipos em definições de coluna ou funções que você cria.
Pergunta:
Existe uma maneira de extrair os vértices de uma linha SDO_GEOMETRY em uma coluna de tabela aninhada em uma consulta - sem usar a função GetVertices()? A saída seria um conjunto de resultados de consulta, não uma tabela estática.
Dicas:
As seguintes funções podem ser úteis:
PointN: Retorna um ponto que é o enésimo vértice na coleção de vértices
GetNumVertices: Retorna o número de vértices na geometria de entrada.
Parece que a única maneira de fazer isso é criando um tipo personalizado e uma função personalizada:
Dados de teste:
Use a função personalizada: