什么是DBLINK?

dblink(Database Link)数据库链接顾名思义就是数据库的链接  ,就像电话线一样,是一个通道,当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就必须要创建远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。

如何使用DBLINK?

场景:假设当前数据库用户为ALANLEE,此时需要通过ALANLEE这个用户去采集远程数据库的数据。

远程数据库信息如下:

HSAJ216 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 12.1.3.216)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = hscsserver)
)
)

远程数据库用户名:hs_user,密码:hundsun

第一步:查看用户是否具备创建database link权限

--查看ALANLEE用户是否具备创建database link权限
select * from user_sys_privs where privilege like upper('%DATABASE LINK%') AND USERNAME='ALANLEE';
select * from user_sys_privs t where t.privilege like upper('%link%');

在数据库中dblink有这么一些权限。例如CREATE DATABASE LINK表示所创建的dblink只能是创建者能使用,别的用户使用不了,CREATE PUBLIC DATABASE LINK表示所创建的dblink所有用户都可以使用,DROP PUBLIC DATABASE LINK表示删除公用dblink的权限。

假如查出相关的数据则表示ALANLEE用户具有相关的权限,如果没有查出数据则说明ALANLEE用户没有相关的权限。

第二步:假如用户不具备相应的权限则需要授权,如果ALANLEE用户具有类似管理员用户授权的权限则直接使用当前用户授权,如果ALANLEE不具备这样的权限则使用SYS/SYSTEM之类权限更大的数据库用户来给ALANLEE用户授权

--需要授予ALANLEE用户创建数据库链接权限
grant create public database link to ALANLEE;
--需要授予ALANLEE用户删除数据库链接权限
grant drop public database link to ALANLEE;

这里我们使用公共的dblink,即所有用户都可以使用的dblink,可以根据自己的所需去赋予相应的权限,授权成功后可以通过第一步的视图查看是否授权成功。

第三步:通过ALANLEE用户创建远程数据库链接(数据库地址:12.1.3.216 用户名:hs_user 密码:hundsun)

drop public database link HSAJ216;
create public database link HSAJ216
connect to hs_user identified by hundsun
using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 12.1.3.216)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = hscsserver)))';

为了避免一些其他的问题,这里建议直接使用远程数据库的全局监听实例名作为database link的名称,也就是远程数据库信息所示的HSAJ216。

第四步:查询已经建立的数据库远程链接

select owner,object_name from dba_objects where object_type='DATABASE LINK';

如果有自己创建的database link数据则说明创建成功,反之就是不存在。

第五步:测试建立的远程数据库链接

select * from dual@HSAJ216;

如果能查出东西,则远程访问便成功了。

如何查询远程数据库某个用户某个表的数据呢?sql如下:

select * from hs_asset.client@HSAJ216;

如果能查询出表的数据,那就可以开始去做数据采集的工作了,查询出相应的数据,插入本地数据库的表中。

最后一步:通过存储过程采集远程数据库的数据并插入到本地的数据库当中

/**
*从柜台同步客户数据至临时表
*/
create or replace PROCEDURE SP_SYNC_CUSTOMER_TEMP (UPDATE_TOTAL OUT NUMBER) IS
INDEX_COUNT NUMBER;
INDEX_TOTAL NUMBER;
CURSOR CR IS
select a.client_id, --客户编号
a.branch_no, --分支机构
a.id_no, --证件号码
a.client_name, --客户姓名
a.client_status, --客户状态
a.open_date, --开户日期
c.fund_account, --资金账号
c.main_flag, --主账标识
c.asset_prop, --资产属性
b.birthday, --生日日期
b.address, --地址
b.home_tel, --家庭电话
b.e_mail, --邮箱
b.fax, --传真
b.mobile_tel, --手机号码
b.office_tel, --单位电话
b.zipcode, --邮政编码
b.account_data --开户规范信息
from hs_asset.client@HSAJ216 a
inner join (select client_id,
birthday,
address,
home_tel,
e_mail,
fax,
mobile_tel,
office_tel,
zipcode,
account_data
from hs_asset.clientinfo@HSAJ216
union all
select client_id,
'' as birthday,
address,
contact_tel as home_tel,
e_mail,
fax,
mobile_tel,
contact_tel as office_tel,
zipcode,
'A' as account_data
from hs_asset.organinfo@HSAJ216) b
on a.client_id = b.client_id
inner join hs_asset.fundaccount@HSAJ216 c
on a.client_id = c.client_id
where c.asset_prop = '';
BEGIN
insert into t_coll_result (id, CREATE_DATE, REMARK)
values (seq_t_coll_result_id.nextval, sysdate, 'START-现在开始执行【SP_SYNC_CUSTOMER_TEMP】清空客户同步临时表TEMP_SYNC_CUSTOMER...');
EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_SYNC_CUSTOMER';
insert into t_coll_result (id, CREATE_DATE, REMARK)
values (seq_t_coll_result_id.nextval, sysdate, 'OVER-【SP_SYNC_CUSTOMER_TEMP】清空客户同步临时表TEMP_SYNC_CUSTOMER已完成...'); insert into t_coll_result (id, CREATE_DATE, REMARK)
values (seq_t_coll_result_id.nextval, sysdate, 'START-现在开始执行【SP_SYNC_CUSTOMER_TEMP】向客户同步临时表导入数据TEMP_SYNC_CUSTOMER...');
commit; INDEX_COUNT := 1;
INDEX_TOTAL := 0;
FOR C IN CR LOOP
--客户临时表
INSERT INTO TEMP_SYNC_CUSTOMER
(CODE,
ORGA_ID,
ID_CARD,
NAME,
CLOSE_STATUS,
ACCOUNT_CREATE_DATE,
CAPITAL_ACCOUNT,
BIRTHDAY,
ADDRESS,
TEL,
BINDING_EMAIL,
BINDING_MOBILE,
MAIN_FLAG
)
VALUES
(C.client_id,
C.branch_no,
C.id_no,
C.client_name,
C.client_status,
C.open_date,
C.fund_account,
C.birthday,
C.address,
C.home_tel,
C.e_mail,
C.mobile_tel,
C.main_flag); INDEX_COUNT := (INDEX_COUNT + 1);
INDEX_TOTAL := (INDEX_TOTAL + 1); IF INDEX_COUNT > 100000 THEN
COMMIT;
insert into t_coll_result (id, CREATE_DATE, REMARK)
values (seq_t_coll_result_id.nextval, sysdate, '【SP_SYNC_CUSTOMER_TEMP】已向TEMP_SYNC_CUSTOMER导入' || INDEX_TOTAL || '条数据...');
commit;
INDEX_COUNT := 1;
END IF;
END LOOP; insert into t_coll_result (id, CREATE_DATE, REMARK)
values (seq_t_coll_result_id.nextval, sysdate, 'OVER-【SP_SYNC_CUSTOMER_TEMP】同步客户临时表TEMP_SYNC_CUSTOMER已完成,共导入' || INDEX_TOTAL || '条数据...');
UPDATE_TOTAL := INDEX_TOTAL;
COMMIT;
END SP_SYNC_CUSTOMER_TEMP;

当然,我们不可能每次都手动去执行sql,所以可以结合oracle数据库的定时任务,在每天的某个时刻自动去执行我们所写的存储过程,这样就相对来说比较完美了。

结束语:为了不让生活留下遗憾和后悔,我们应该尽可能抓住一切改变生活的机会。

可爱博主:AlanLee

博客地址:http://www.cnblogs.com/AlanLee

本文出自博客园,欢迎大家加入博客园。

Oracle数据库通过DBLINK实现远程访问的更多相关文章

  1. SQLSERVER 创建对Oracle数据库的DBlink以及查询使用

    1. 与针对oracle数据库一样, 在sqlserver中创建对oracle数据库的dblink 安全性上面也进行定义(貌似不需要跟访问字符串只需要填一个即可) 发现有的版本改注册表不管用 还得修改 ...

  2. Oracle数据库 Synonym和DBLink

    1.1数据库创建同义词(synonym) Oracle的同义词(synonyms)从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系.它可以节省大量的数据库空间,对不同用户的操作同一张表没 ...

  3. 在oracle配置mysql数据库的dblink

    本文介绍如何在oracle配置mysql数据库的dblink:虽然dblink使用很占资源:俗称“性能杀手”.但有些场景不得不使用它.例如公司使用数据库是oracle:可能其他部门或者CP合作公司使用 ...

  4. 关于远程访问Oracle数据库的设置(共享数据库)

    写在前面: 需求描述:     我笔记本上安装了oracle数据库, 现在同事也想连接这个数据库. 也就是设置为别人能远程访问我本地的数据库. 思路:     通过在我笔记本WiFi共享,别人连接该W ...

  5. PLSQL远程访问Oracle数据库配置

    PLSQL远程访问Oracle数据库的配置 监听器(LISTENER) :监听器是Oracle基于服务器端的一种网络服务,主要用于监听客户端向数据库服务器端提出的连接请求.既然是基于服务器端的服务,那 ...

  6. Oracle数据库远程访问

    如果需要访问非本机的Oracle数据库,首先需要安装一个Oracle的客户端,我直接安装的服务器版本的Oracle,也自带客户端. 安装完成后,如果访问本机的服务器的话,直接就可以访问,无需配置, 如 ...

  7. Oracle 数据库基础——安装

    一.数据库基础知识 1.概念 数据库全称数据库管理系统,简称DBMS,是一种在计算机中,针对数据进行管理.存储.共享的一种技术. 2.分类 数据库的发展过程中,按逻辑模型可分为以下几种: 3.关系型数 ...

  8. Oracle数据库如何创建DATABASE LINK?

    Oracle数据库如何创建DATABASE LINK? 2011-08-09 14:54 taowei20061122 CSDN博客  http://blog.csdn.net/taowei20061 ...

  9. 【转】oracle数据库开发的一些经验积累

    1.不安装Oracle客户连接Oracle 8的方法  请将以下文件拷贝到运行文件所在目录 一.ODBC动态库 : ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc ...

随机推荐

  1. (转)一个MySQL 5.7 分区表性能下降的案例分析

    一个MySQL 5.7 分区表性能下降的案例分析 原文:http://www.talkwithtrend.com/Article/216803 前言 希望通过本文,使MySQL5.7.18的使用者知晓 ...

  2. java数据结构之递归算法

    概述程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用.递归有直接递归和间接递归•直接递归:函数在执行过程中调用本身.•间接递归:函数在执行过程中调用其它 ...

  3. 【jQuery源码】jQuery对象初始化

    看了一下午还是有很多地方没弄明白,jQuery的一些工具方法的原理也不完全清楚,这篇文章会随着我深入阅读jQuery源码的同时不断更新. // Initialize a jQuery object / ...

  4. Android 开发工具类 27_多线程下载大文件

    多线程下载大文件时序图 FileDownloader.java package com.wangjialin.internet.service.downloader; import java.io.F ...

  5. Java中的四种引用

    引用定义 实际上,Java中存在四种引用,它们由强到弱依次是:强引用.软引用.弱引用.虚引用.下面我们简单介绍下这四种引用: 强引用(Strong Reference):通常我们通过new来创建一个新 ...

  6. for循环-鼠标移入事件

    这里当鼠标移入触发事件时候,会报错,为什么呢?注意一下objs数组的长度是5. 因为在鼠标移入事件触发之前for循环已经将i变成5,objs[5]是不存在的,所以会报错. 可以用this来解决这种问题 ...

  7. UIKit 框架之Bar、Controller

    UIKit框架中有各种Bar,UITabBar.UINavigationBar.UIToolbar.Bar对应的就有一些Item,tabBarItem.navigationItem.toolbarIt ...

  8. hadoop学习笔记(四):HDFS

    一.HDFS体系结构 1 HDFS假设条件 数据流访问 大数据集 简单相关模型 移动计算比移动数据便宜 多种软硬件平台中的可移植性 2 HDFS的设计目标 非常巨大的分布式文件系统 运行于普通硬件上 ...

  9. Magento2开发教程 - 如何向数据库添加新表

    Magento 2具有特殊的机制,允许你创建数据库表,修改现有的,甚至添加一些数据到他们(如安装数据,已被添加在模块安装). 这种机制允许这些变化可以在不同的设备之间传输. 关键的概念是,而不是做你能 ...

  10. ModelState.IsValid always returning true while mocking a request

    ASB.net  MVC 视图验证里有一个IValidatableObject接口.这里面有一个验证方法.通常我们表单提交的时候dto就是用一个实现IValidatableObject这个接口的实体. ...