You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:33:24