代码之家  ›  专栏  ›  技术社区  ›  User1974

修改SDO_GEOMETRY GTYPE属性而不创建自定义函数

  •  0
  • User1974  · 技术社区  · 4 年前

    我有一个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:3006
    • 新款GTYPE:3306

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

    但是,作为一个实验,我希望在不使用自定义函数的情况下修改查询中SELECT子句中的GTYPE属性权限。

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

    modify_object_property(object, property_name, new_val) returns sdo_geometry
    

    是否有一种方法可以在不创建自定义函数的情况下修改SDO_GEOMETRY GTYPE属性/属性?

    相关: Replace value in SDO_ELEM_INFO_ARRAY varray

    0 回复  |  直到 4 年前
        1
  •  1
  •   Simon Greener    4 年前

    您可以使用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;
    
    
        2
  •  1
  •   Albert Godfrind    4 年前

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

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

    但这不是你想要的。无法在选择列表中以这种方式修改对象。因此,该方法通过自定义函数。

    推荐文章