Oracle 18c转换SDO_ORDINATE_ARRAY为内置VARRAY创建函数索引
Oracle 18c
可以从SDO_GEOMETRY对象中获取SDO_ORDINATE_ARRAY值,测试代码如下:
create table test_table (shape sdo_geometry); insert into test_table (shape) values (sdo_geometry('linestring(10 20, 30 40, 50 60)')); insert into test_table (shape) values (sdo_geometry('linestring(70 80, 90 100)')); insert into test_table (shape) values (sdo_geometry('linestring(110 120, 130 140, 150 160, 170 180)')); select (shape).sdo_ordinates as sdo_ordinate_array from test_table -- 查询返回结果 SDO_ORDINATE_ARRAY ------------------ MDSYS.SDO_ORDINATE_ARRAY(10, 20, 30, 40, 50, 60) MDSYS.SDO_ORDINATE_ARRAY(70, 80, 90, 100) MDSYS.SDO_ORDINATE_ARRAY(110, 120, 130, 140, 150, 160, 170, 180)
在SQL Developer中查看,MDSYS.SDO_ORDINATE_ARRAY的类型定义如下:
create or replace TYPE SDO_ORDINATE_ARRAY AS VARRAY(1048576) OF NUMBER
需求与问题背景
计划通过自定义函数将SDO_ORDINATE_ARRAY转换为内置VARRAY数据类型,用于创建非空间函数基索引(Function-Based Index, FBI)。
Oracle的FBI仅支持内置数据类型,不支持Oracle提供的自定义类型或抽象数据类型(Abstract Datatype, ADT),SDO_ORDINATE_ARRAY、SDO_GEOMETRY均无法直接用于创建FBI:
- Oracle社区已有提案希望支持在抽象数据类型上创建函数基索引,但该功能目前尚未落地。
- 基于函数的空间索引无法满足需求:本次需要在查询的SELECT列表中调用索引,而非在WHERE子句中执行空间操作,现有空间索引不支持该使用方式。
直接尝试创建如下FBI会执行失败:
create index sdo_ordinates_idx on test_table ((shape).sdo_ordinates);
对应报错信息如下:
Error starting at line : 12 in command - create index sdo_ordinates_idx on test_table ((shape).sdo_ordinates) Error report - ORA-02327: cannot create index on expression with datatype ADT 🡄 ADT=Abstract Datatype 02327. 00000 - "cannot create index on expression with datatype %s" *Cause: An attempt was made to create an index on a non-indexable expression. *Action: Change the column datatype or do not create the index on an expression whose datatype is one of VARRAY, nested table, object, LOB, or REF.
报错明确说明无法在ADT类型的表达式上创建索引,因此需要先将坐标数组转换为常规内置VARRAY类型,再基于转换后的值创建FBI。
核心问题
是否存在可行方法将SDO_ORDINATE_ARRAY转换为内置VARRAY类型,以支持创建函数基索引?
要求坐标必须存储为标准VARRAY格式,不能转换为文本格式——SDO_GEOMETRY构造函数仅接受数组类型值作为入参,不支持文本格式入参。
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

