ArcSDE进行跨数据库的关联
以前有用户曾经问过这样一个问题 我想进行数据的关联,这很简单啊,ArcSDE提供了很多关联方式,join、视图、QueryLayer等, 详细参考:http://blog.csdn.net/linghe301/article/details/6649717 但是用户要求的条件比较特殊,这两个数据分布在两个库中,这可
以前有用户曾经问过这样一个问题
我想进行数据的关联,这很简单啊,ArcSDE提供了很多关联方式,join、视图、QueryLayer等,
详细参考:http://blog.csdn.net/linghe301/article/details/6649717
但是用户要求的条件比较特殊,这两个数据分布在两个库中,这可以进行关联么?答案是肯定的。下面我们就一一演示一下怎么进行跨库的关联,其实关键的步骤就是Oracle数据库的跨库查询,其他方面就跟一个库一样了。
比如我们有一个库orcl里面用户test的表为place,另外一个库orcl2里面用户sde的表为owner
首先我们看看这两个表的结构
C:\Users\Administrator>sqlplus test/test@orcl SQL*Plus: Release 11.2.0.1.0 Production on 星期一 2月 6 15:50:04 2012 Copyright (c) 1982, 2010, Oracle. All rights reserved. 连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> desc place; 名称 是否为空? 类型 ----------------------------------------- -------- -------------------------- OBJECTID NOT NULL NUMBER(38) NAME NVARCHAR2(50) PID NUMBER(38) ID NUMBER(38) SHAPE SDE.ST_GEOMETRY
查看另外一个实例,看owner的结构
C:\Users\Administrator>sqlplus sys/oracle@orcl2 as sysdba SQL*Plus: Release 11.2.0.1.0 Production on 星期一 2月 6 15:50:52 2012 Copyright (c) 1982, 2010, Oracle. All rights reserved. 连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> desc sde.owner; 名称 是否为空? 类型 ----------------------------------------- -------- ------------------------- OBJECTID NOT NULL NUMBER(38) PID NUMBER(10) ID NUMBER(10) NAME NVARCHAR2(50) NAME1 NVARCHAR2(50)place是空间表,owner为属性表,这两个表的ID为关联字段
首先我们将这两个表在数据库层次上进行关联
create public database link ABB connect to SDE using 'orcl2';
create public database link ABC connect to SDE using '(DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.100.111)(PORT=1521)) ) (CONNECT_DATA= (SERVICE_NAME=orcl2) ) )';
以上两种关联方法都可以,具体步骤就是我连接实例orcl的sys用户,然后其中ABB是你建树的dblink名字,orcl2是远程数据库的实例名/网络服务名,sde/sde是登录到远程数据库的用户/密码。然后在当地数据库中经由过程dblink访谒远程数据库'orcl2'中
那么我们在一个实例查看另一个实例的某个用户的表名应该是:
用户名.表名@数据库连接名(上面的link名称)
SQL> conn sys/oracle@orcl as sysdba 已连接。 SQL> create public database link ABB connect to sde identified by sde using 'orcl2'; 数据库链接已创建。 SQL> desc sde.owner@ABB; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- OBJECTID NOT NULL NUMBER(38) PID NUMBER(10) ID NUMBER(10) NAME NVARCHAR2(50) NAME1 NVARCHAR2(50)
SQL> conn sys/oracle@orcl as sysdba 已连接。 SQL> create public database link ABB connect to sde identified by sde using 'orcl2'; 数据库链接已创建。 SQL> desc sde.owner@ABB; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- OBJECTID NOT NULL NUMBER(38) PID NUMBER(10) ID NUMBER(10) NAME NVARCHAR2(50) NAME1 NVARCHAR2(50)
尽量创建public,不然针对不同用户有权限的问题,如果对权限要求很高,也可以不使用public
那么我们创建相关的视图
SQL> create or replace view myview1 as select test.place.pid,test.place.shape,sde.owner@ABB.name from test.place,sde.own er@ABB where test.place.id=sde.owner@ABB.id; create or replace view myview1 as select test.place.pid,test.place.shape,sde.owner@ABB.name from test.place,sde.owner@AB B where test.place.id=sde.owner@ABB.id * 第 1 行出现错误: ORA-02019: 未找到远程数据库的连接说明 ORA-04054: 数据库链接 ABB.ID 不存在
可见在orcl实例下直接使用sde.owner@ABB.id获得orcl2实例里面的owner表中的id字段系统不支持,那我们将sde.owner@ABB在orcl实例下创建一个同义词来代替。
创建同义词
SQL> conn sys/oracle@orcl as sysdba 已连接。 SQL> create public synonym mysyn1 for sde.owner@abb; 同义词已创建。 SQL> conn test/test@orcl; 已连接。 SQL> desc mysyn1; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- OBJECTID NOT NULL NUMBER(38) PID NUMBER(10) ID NUMBER(10) NAME NVARCHAR2(50) NAME1 NVARCHAR2(50)
创建视图
SQL> create or replace view myview1 as select test.place.pid,test.place.shape,mysyn1.name from test.place,mysyn1 where test.place.id=mysyn1.id; 视图已创建。
ArcSDE注册
C:\Users\Administrator>sdelayer -o register -l myview1,shape -e a -t ST_GEOMETRY -i sde:oracle11g:orcl -u test -p test ArcSDE 10.0 for Oracle11g Build 1937 Tue Aug 16 16:08:18 2011 Layer Administration Utility ----------------------------------------------------- Successfully Created Layer.
结束语:个人感觉,这种方式来进行关联不太稳定,至少我将该图层数据加载到ArcGIS Desktop导致桌面软件崩溃(也有可能因为我环境问题导致的),不过使用sql操作都没有问题,不是万不得已,建议慎重考虑使用该方式。
上一篇: 如何实现PHP根据数组的值进行分组
推荐阅读
-
zabbix进行数据库备份以及表分区的方法
-
And,Where使用提示以及用+进行左关联的提示及注意事项
-
在对数据库的数据库进行操作发生“”附近有语法错误。 字符串 ') ' 后的引号不完整 ”错误
-
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
-
利用OGG进行数据库表的初始化
-
详解数据库中跨库数据表的运算
-
数据库SQL实战:从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略(题解)
-
将xml文件作为一个小的数据库,进行学生的增删改查的简单实例
-
Oracle数据库空间满了进行空间扩展的方法
-
C#操作LINQ to SQL组件进行数据库建模的基本教程