创建SDO_GEOMETRY对象的ODCI列表

发布于 2025-02-06 16:18:21 字数 2398 浏览 1 评论 0原文

我最近了解了ODCI列表(在 @mt0 的答案中。

例如,odcivarchar2list

select 
    sys.odcivarchar2list('a', 'b', 'c') as my_list
from 
    dual


MY_LIST                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
-------------------------------
ODCIVARCHAR2LIST('a', 'b', 'c')

出于好奇,是否有一种方法可以创建mdsys.sdo_geometry对象的ODCI列表?

我尝试使用odciobjectList

select 
    sys.ODCIObjectList(
        sdo_geometry('point(10 20)'),
        sdo_geometry('point(30 40)'),
        sdo_geometry('point(50 60)')
    ) as my_list
from 
    dual

但是我有一个错误,表明odciobjectList并不是sdo_geometry对象:

ORA-00932: inconsistent datatypes: expected SYS.ODCIOBJECT got MDSYS.SDO_GEOMETRY
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:
Error at Line: 3 Column: 9

I recently learned about ODCI lists (in an answer from @MT0).

For example, an OdciVarchar2List:

select 
    sys.odcivarchar2list('a', 'b', 'c') as my_list
from 
    dual


MY_LIST                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
-------------------------------
ODCIVARCHAR2LIST('a', 'b', 'c')

Out of curiosity, is there a way to create a ODCI list of MDSYS.SDO_GEOMETRY objects?

I tried using ODCIObjectList:

select 
    sys.ODCIObjectList(
        sdo_geometry('point(10 20)'),
        sdo_geometry('point(30 40)'),
        sdo_geometry('point(50 60)')
    ) as my_list
from 
    dual

But I got an error, suggesting that ODCIObjectList isn't meant for sdo_geometry objects:

ORA-00932: inconsistent datatypes: expected SYS.ODCIOBJECT got MDSYS.SDO_GEOMETRY
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:
Error at Line: 3 Column: 9

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

划一舟意中人 2025-02-13 16:18:21

有没有一种方法来创建odci mdsys.sdo_geometry对象的列表?

不,odci类型是属于sys架构的内置类型,并且没有odci列表可以容纳SDO几何对象。

您要么创建自己的收集类型; 请参阅Justin Cave的答案

或者,您需要寻找其他内置收集类型。


要查找现有的集合类型,您可以使用:

SELECT *
FROM   ALL_TYPES
WHERE  TYPECODE  = 'COLLECTION'

找到所有内置集合的列表。

SDO对象是在mdsys架构中定义的,您可以过滤到使用:

SELECT *
FROM   ALL_TYPES
WHERE  OWNER     = 'MDSYS'
AND    TYPECODE  = 'COLLECTION'

其中包含92个集合类型的那些;其中之一是sdo_geometry_array类型,它恰好可以按照您想要的方式完成。


因此,如果您不想创建自己的类型,则可以使用:

SELECT MDSYS.SDO_GEOMETRY_ARRAY(
         sdo_geometry('point(10 20)'),
         sdo_geometry('point(30 40)'),
         sdo_geometry('point(50 60)')
       )
FROM   DUAL;

或者更简单:

SELECT SDO_GEOMETRY_ARRAY(
         sdo_geometry('point(10 20)'),
         sdo_geometry('point(30 40)'),
         sdo_geometry('point(50 60)')
       )
FROM   DUAL;

is there a way to create a ODCI list of MDSYS.SDO_GEOMETRY objects?

No, the ODCI types are built-in types belonging to the SYS schema and there is no ODCI list that can hold SDO geometry objects.

You either create your own collection type; see Justin Cave's answer.

Or you need to look for a different (non-ODCI) built-in collection type.


To find the existing collection types, you can use:

SELECT *
FROM   ALL_TYPES
WHERE  TYPECODE  = 'COLLECTION'

To find a list of all the built-in collections.

The SDO objects are defined in the MDSYS schema and you can filter to just those using:

SELECT *
FROM   ALL_TYPES
WHERE  OWNER     = 'MDSYS'
AND    TYPECODE  = 'COLLECTION'

Which contains 92 collection types; one of which is the SDO_GEOMETRY_ARRAY type which happens to do exactly what you want.


Therefore, if you do not want to create your own type, you can use:

SELECT MDSYS.SDO_GEOMETRY_ARRAY(
         sdo_geometry('point(10 20)'),
         sdo_geometry('point(30 40)'),
         sdo_geometry('point(50 60)')
       )
FROM   DUAL;

or, more simply:

SELECT SDO_GEOMETRY_ARRAY(
         sdo_geometry('point(10 20)'),
         sdo_geometry('point(30 40)'),
         sdo_geometry('point(50 60)')
       )
FROM   DUAL;
淡水深流 2025-02-13 16:18:21

声明自己的收集类型非常简单,绝对是要走的路。如果您碰巧在您确实需要使用集合但不允许出于某种原因声明自己的收集类型(即您使用读取的读取),那么能够使用ODCI收集类型可能会很方便 - 仅数据库)。不过,总的来说,声明自己的收藏类型(可以给出更有用的名称,然后您可以像模式中的所有其他对象一样管理它们更有意义。

create or replace type sdo_geometry_nt is table of sdo_geometry;
/

declare
  l_points sdo_geometry_nt := sdo_geometry_nt( sdo_geometry( 'point(10 20)' ),
                                               sdo_geometry( 'point(30 40)' ),
                                               sdo_geometry( 'point(50 60)' ));
begin
  for i in 1..l_points.count
  loop
    -- do something
    null;
  end loop;
end;
/

Declaring your own collection type is pretty easy and definitely the way to go. Being able to use the ODCI collection types can be handy if you happen to be in a situation where you really need to use a collection but you're not allowed to declare your own collection type for some reason (i.e. you're using a read-only database). In general, though, it makes vastly more sense to declare your own collection types (which can be given more informative names and which you can then manage just like all the other objects in the schema.

create or replace type sdo_geometry_nt is table of sdo_geometry;
/

declare
  l_points sdo_geometry_nt := sdo_geometry_nt( sdo_geometry( 'point(10 20)' ),
                                               sdo_geometry( 'point(30 40)' ),
                                               sdo_geometry( 'point(50 60)' ));
begin
  for i in 1..l_points.count
  loop
    -- do something
    null;
  end loop;
end;
/
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文