问题来源
项目上使用的数据库系统是Oracle服务器,和我们系统集成的另一个系统使用的也是oracle数据,需要对方向我们开放数据。目前使用的策略是,对方直接给我们开放数据库的帐号和密码,我们从中取数据。
根据业务需要,对方提供的数据需要和我们库的数据做整合才能得到我们需要的结果。换言之,需要两个库的数据进行连接。
解决办法
从网上找到关于db link的信息。
文章1:https://www.cnblogs.com/xiaohuizhenyoucai/p/11083187.html
文章2:https://wenku.baidu.com/view/f544db03cc175527072208c4.html
db link可以将两个oracle服务连接起来。假设两个服务分别为A和B,可以建立一个从A到B 连接,这样在A上面,就可以像操作A中的表一样操作B中的表,甚至可以把A中的表和B中的表进行连接查询。这种实现方式有些像mysql中FEDERATED引擎下的远程表。
使用db link这种方式有如下好处。
- 方便两个服务上的表进行连接查询。
- 应用程序访问数据库,减少了数据源的配置。
- 近似实现了数据实时同步的效果。
配置过程
配置信息,主要包含两部分的内容
- 要连接的数据的信息,其中包括远程oracle的服务名称,用户名称和账户密码。
- 连接的名称。这个名称要在本地数据库访问远程数据库表的时候用到。
ddl实现
配置的SQL如下图所示
其中:
- link_name:指的是创建的连接名称。
- USER_NAME:指的是远程数据库的用户名,注意用户名不加引号。
- PASSWORD指的是远程数据库的用户密码,注意用户密码不加引号。
- SERVICE_NAME:指的是远程数据库的服务名称。
create public database link LINK_NAME connect to USER_NAME identified by PASSWORD
USING '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.0.123)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = SERVICE_NAME)))';
使用时,在要查询的远程数据库表后面,加上@LINK_NAME。如:
SELECT * FROM SCHEMA_NAME.TABLE_NAME@LINK_NAME
这里需要注意的是,SCHEMA_NAME指的是远程数据库的schema名称,一定要加,否则会报如下错误。
配置实现
- 配置本地服务器oracle的tnsnames.ora,将远程oracle数据库的连接配置进来
TLINK =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.100.100.100)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oracle)
)
)
create public database link alink
connect to scott identified by tiger using 'TLINK';
|