修改对象 attribute/property — 不创建自定义函数

Modify object attribute/property — without creating custom function

我有一个 Oracle 18c SDO_GEOMETRY object 具有属性(又名属性):

with cte as (
select 
    sdo_util.from_wktgeometry('MULTILINESTRING ((0 5 0, 10 10 10, 30 0 33.54),(50 10 33.54, 60 10 -10000))') shape
from dual)

select 
    a.shape.sdo_gtype as old_gtype,
    a.shape.sdo_gtype + 300 as new_gtype,
    a.shape
from 
    cte a


OLD_GTYPE  NEW_GTYPE    SHAPE 
---------  ---------    -----
     3006       3306    SDO_GEOMETRY(3006, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1, 10, 2, 1), SDO_ORDINATE_ARRAY(0, 5, 0, 10, 10, 10, 30, 0, 33.54, 50, 10, 33.54, 60, 10, -10000))

我想修改SDO_GEOMETRY对象的GTYPE属性:


可以使用自定义函数(或内联函数)修改 GTYPE 属性:

但是,作为实验,我想在查询的 SELECT 子句中直接修改 GTYPE 属性,而不使用自定义函数。

例如,我想知道是否有这样的 OOTB 功能:

modify_object_property(object, property_name, new_val) returns sdo_geometry

有没有办法在不创建自定义函数的情况下修改 SDO_GEOMETRY GTYPE attribute/property?

您可以修改SQL中对象的内容。您只需要确保在 table 上使用 别名 。例如:

update my_table t
set t.geom.sdo_gtype = t.geom.sdo_gtype + 300
where ... ;

但这不是您要找的。在 select 列表中以这种方式修改对象是不可能的。因此,通过自定义函数的方法。

您可以按如下方式使用sdo_geometry构造函数



    with cte as (
    select 
        sdo_util.from_wktgeometry('MULTILINESTRING ((0 5 0, 10 10 10, 30 0 33.54),(50 10 33.54, 60 10 -10000))') shape
    from dual)
    select sdo_geometry(a.shape.sdo_gtype + 300,
                        a.shape.sdo_srid,
                        a.shape.sdo_point,
                        a.shape.sdo_elem_info,
                        a.shape.sdo_ordinates) as shape
      from cte a;