使用ArcSDE SQL操作怎么获得新对象的objectid、GUID

时间:2021-02-24 04:52:51

现在大家很喜欢使用ArcSDE的SQL操作,这种方式在特殊的环境要求下显得比较方便,那么使用SQL操作最多的是读和写,而写最多的就是新建一个对象,那么翻译成SQL语言就是使用insert方式比较多,那么问题出来了,大家都知道ArcGIS的每一个要素类都是有ObjectID的,而且这个字段是不能重复的,那么当我要插入一个新的对象,这个ObjectID值怎么获得呢?


如果对ArcSDE或者是数据库比较熟悉的话,可能会将要素类(数据库层次就是表),表对象的序列找出来,其实ObjectID走的也是一个序列,然后获得nextValue即可,这种方式是不严谨的。


下一个可用对象 ID 不一定是最后所插入对象 ID 之后的下一个顺序编号。某些客户端应用程序的对象 ID 会进行批量分配,因此下一个可用对象 ID 的编号可能比最后使用的对象 ID 大许多。同样,批中任何未使用的对象 ID 会返回可用值池中,这意味着下一个可用对象 ID 值可能实际上小于最后插入的对象 ID 值。


那么我们该使用什么方式呢?

使用 sde.version_user_ddl 包中的 next_row_id 函数为对象 ID 生成新的唯一值。 

next_row_id 函数使用两个参数:所有者和注册 ID。所有者是拥有该表的用户的名称。注册 ID 来自 TABLE_REGISTRY ArcSDE 系统表。利用表的所有者名称和注册 ID,可创建 SQL 语句来填充对象 ID 列。


操作步骤:

1:连接到Sqlplus

2:找到操作对象要素类对应的注册ID

SELECT registration_id FROM sde.table_registry WHERE table_name = 'STREAMS' and owner = 'ENG2';

REGISTRATION_ID   131

3:进行操作

INSERT INTO eng2.streams (OBJECTID,NAME,SHAPE) VALUES(sde.version_user_ddl.next_row_id('ENG2', 131), 
'TRANQUIL', sde.ST_GEOMETRY('linestring (750 150, 750 750)', 4) );

PS:如果用户需要GUID,也可以使用version_user_ddl.retrieve_guid函数进行创建

INSERT INTO mytable_vw (globalid,shape) 
VALUES
(sde.version_user_ddl.retrieve_guid,(sde.st_polygon

('polygon ((10000 520000, 100008889 55000, 1045545983 234280934,
10000 520000))',4)));