如何创建包含MDSYS.SDO_GEOMETRY对象的ODCI列表
解答
Oracle本身没有提供可以直接存储MDSYS.SDO_GEOMETRY对象的内置ODCI列表。所有ODCI前缀的内置集合类型都是为Oracle Data Cartridge接口设计的固定类型,只支持预设的特定数据类型,常见内置ODCI列表的适配类型如下:
SYS.ODCIVarchar2List:仅支持存储VARCHAR2类型值SYS.ODCINumberList:仅支持存储NUMBER类型值SYS.ODCIDateList:仅支持存储DATE类型值SYS.ODCIObjectList:仅支持存储SYS.ODCIOBJECT类型的实例,不能直接传入其他Schema下的对象类型,这就是之前尝试传入SDO_GEOMETRY时报类型不匹配错误的原因。
实现方法
直接参照ODCI列表的定义逻辑,自定义对应元素类型的嵌套表即可,使用方式和内置ODCI列表完全一致,没有额外学习成本。
第一步先创建集合类型:
-- 创建支持存储SDO_GEOMETRY对象的嵌套表类型 CREATE OR REPLACE TYPE SdoGeometryList AS TABLE OF MDSYS.SDO_GEOMETRY; /
创建完成后就可以像用ODCIVarchar2List一样直接调用:
SELECT SdoGeometryList( sdo_geometry('point(10 20)'), sdo_geometry('point(30 40)'), sdo_geometry('point(50 60)') ) AS my_list FROM dual;
不要尝试用类型强转的方式把SDO_GEOMETRY塞进
ODCIObjectList:ODCIOBJECT是ODCI接口专用的特殊对象类型,强转存储后后续读取、做空间运算都需要额外做反向类型转换,很容易触发隐式转换错误,也不符合集合类型的设计规范。
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

