概述
通過筆者這周的學習,對數據抽取有了一個大致的瞭解。所謂數據抽取,就是將數據從數據源(一般爲關係型數據庫)中抽取出來的過程,可分爲全量抽取和增量抽取兩種類型。全量抽取比較容易理解,顧名思義,相當於數據庫的遷移和複製。增量抽取則是將數據庫中的表自上次抽取以來修改、刪除、更新的數據抽取出來。而數據抽取的方式也分爲手動抽取和使用工具抽取兩種類型。手動抽取就是我們通過創建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這個存儲過程,實現其中的功能。