概述
通过笔者这周的学习,对数据抽取有了一个大致的了解。所谓数据抽取,就是将数据从数据源(一般为关系型数据库)中抽取出来的过程,可分为全量抽取和增量抽取两种类型。全量抽取比较容易理解,顾名思义,相当于数据库的迁移和复制。增量抽取则是将数据库中的表自上次抽取以来修改、删除、更新的数据抽取出来。而数据抽取的方式也分为手动抽取和使用工具抽取两种类型。手动抽取就是我们通过创建dblink+编写存储过程+编写定时任务的方式来手动抽取数据。而通过工具则是通过ETL工具完成数据的抽取。
Database Link
上文提到,手动抽取数据中的第一步就是创建一个dblink。dblink是一种数据库之间连接的手段,它相当于一座桥梁,将两个数据库连接起来,使我们可以对另一个数据库中的数据进行无障碍的操作。以下是dblink创建的基本语法:
create databse link link_name connect to r_username identified by r_pwd using 'dbstr';
其中,link_name 是你为这次连接起的一个名字,r_username是你要连接的远程数据库的用户名,而r_pwd 是用户名所对应的密码。dbstr是连接字符串,tnsnames.ora中定义远程数据库的连接串,也可以在创建dblink的时候直接指定。
创建dblink之前必须确定用户拥有创建dblink的权限,否则需要登录sys为用户授权。授权的基本语法为:
grant create public database link,drop public database link to username;
其中username是你要授权的用户名。
存储过程
在上文提到,手动实现数据抽取的第二步就是创建存储过程。所谓存储过程,实际上就是一段sql的语句集。相比于传统的sql,存储过程具有业务系统与数据库交互少,一次编译多次调用,执行效率高等优点。虽然阿里的开发者手册里明确禁止了使用存储过程,但其仍然在政府、医疗、金融等项目的数据库中占有一席之地。存储过程的基本语法为:
CREATE [OR REPLACE] PROCEDURE procedure_name
(参数部分)
is/as
声明区域
begin
执行区域
exception
异常处理区域
end;
定时任务
创建job(定时任务)可以实现定时调用存储过程的功能。下面是笔者写过的一个简单的job
declare
job number;
BEGIN
DBMS_JOB.SUBMIT(
JOB => job, /*自动生成JOB_ID*/
WHAT => 'prc_job;', /*需要执行的存储过程名称或SQL语句*/
NEXT_DATE => sysdate+3/(24*60), /*初次执行时间-下一个3分钟*/
INTERVAL => 'trunc(sysdate,''mi'')+1/(24*60)' /*每隔1分钟执行一次*/
);
commit;
end;
创建好定时任务之后,运行即可完成定时调用prc_job这个存储过程,实现其中的功能。