Oracle日志表的使用方式
1.日志表定義
日志一般會(huì)記錄:同步的源表名,同步的目標(biāo)表名,步驟名稱,記錄行數(shù),狀態(tài),開(kāi)始時(shí)間,結(jié)束時(shí)間,備注。
2.創(chuàng)建日志表
CREATE TABLE log_table
(
source_table_name VARCHAR2(100),
target_table_name VARCHAR2(100),
step_name VARCHAR2(100),
ROW_COUNT NUMBER,
status VARCHAR2(30),
start_dt DATE,
end_dt DATE,
mark VARCHAR2(100)
);3.開(kāi)發(fā)往log_table同步數(shù)據(jù)的存儲(chǔ)過(guò)程
CREATE OR REPLACE PROCEDURE p_log(
p_source_table_name VARCHAR2,
p_target_table_name VARCHAR2,
p_step_name VARCHAR2,
p_ROW_COUNT NUMBER,
p_status VARCHAR2,
p_start_dt DATE,
p_end_dt DATE,
p_mark VARCHAR2) IS
BEGIN
INSERT INTO log_table
VALUES (p_source_table_name,
p_target_table_name,
p_step_name,
p_ROW_COUNT,
p_status,
p_start_dt,
p_end_dt,
p_mark);
COMMIT;
---異常
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;
-- 調(diào)用存儲(chǔ)過(guò)程
BEGIN
p_log(p_source_table_name,
p_target_table_name,
p_step_name,
p_ROW_COUNT,
p_status,
p_start_dt,
p_end_dt,
p_mark);
END;4.開(kāi)發(fā)存儲(chǔ)過(guò)程 emp同步數(shù)據(jù)到 emp_1135
drop table emp_1135;
create table emp_1135 as select * from emp where 1 = 2;
-- 給emp_1135表添加主鍵
ALTER TABLE emp_1135 ADD CONSTRAINT PK_EMP_1135 PRIMARY KEY (EMPNO);
-- 創(chuàng)建存儲(chǔ)過(guò)程
create or replace procedure p_19
as
v_source varchar2(20);
v_target varchar2(20);
v_st date;
v_dt date;
v_ct number;
begin
v_st := sysdate;
v_source := 'emp';
v_target := 'emp_1135';
insert into emp_1135
select *
from emp;
v_ct := SQL%ROWCOUNT;
commit;
v_dt := sysdate;
-- 調(diào)用日志表存儲(chǔ)過(guò)程
p_log(p_source_table_name=>v_source,
p_target_table_name=>v_target,
p_step_name=>v_source || ' to ' || v_target,
p_ROW_COUNT=>v_ct,
p_status=>'成功',
p_start_dt=>v_st,
p_end_dt=>v_dt,
p_mark=>'');
-- 定義異常
exception
when others then
p_log(p_source_table_name=>v_source,
p_target_table_name=>v_target,
p_step_name=>v_source || ' to ' || v_target,
p_ROW_COUNT=>0,
p_status=>'失敗',
p_start_dt=>v_st,
p_end_dt=>null,
p_mark=>SQLERRM);
end;
-- 調(diào)用存儲(chǔ)過(guò)程
begin
p_19;
end;select * from emp_1135;

-- 查詢?nèi)罩颈? select * from log_table;

再次調(diào)用存儲(chǔ)過(guò)程
-- 調(diào)用存儲(chǔ)過(guò)程
begin
p_19;
end;select * from emp_1135;

-- 查詢?nèi)罩颈? select * from log_table;

5.開(kāi)發(fā)一個(gè)存儲(chǔ)過(guò)程
將EMP表同步到 EMP_1134,然后將通過(guò)EMP_1134這個(gè)表數(shù)據(jù)計(jì)算每個(gè)部門(mén)總薪資,同步到 EMP_SUM_SAL
CREATE TABLE emp_1134 AS SELECT * FROM emp WHERE 1=2; -- 添加主鍵 alter table emp_1134 ADD CONSTRAINT PK_EMP_1134 PRIMARY KEY (empno); CREATE TABLE EMP_SUM_SAL (deptno NUMBER,sum_sal NUMBER);
create or replace procedure p_20 as
v_st date;
v_dt date;
v_ct number;
v_source varchar2(50);
v_dir varchar2(50);
begin
v_source := 'emp';
v_dir := 'emp_1134';
v_st := sysdate;
insert into emp_1134
select * from emp;
v_ct := SQL%ROWCOUNT;
commit;
v_dt := sysdate;
p_log(p_source_table_name => v_source,
p_target_table_name => v_dir,
p_step_name => v_source || ' to ' || v_dir,
p_ROW_COUNT => v_ct,
p_status => '成功',
p_start_dt => v_st,
p_end_dt => v_dt,
p_mark => '');
-------------------------------------------------------
v_source := 'emp_1134';
v_dir := 'EMP_SUM_SAL';
v_st := sysdate;
insert into EMP_SUM_SAL
select deptno, sum(sal) from emp_1134 group by deptno;
v_ct := SQL%ROWCOUNT;
commit;
v_dt := sysdate;
p_log(p_source_table_name => v_source,
p_target_table_name => v_dir,
p_step_name => v_source || ' to ' || v_dir,
p_ROW_COUNT => v_ct,
p_status => '成功',
p_start_dt => v_st,
p_end_dt => v_dt,
p_mark => '');
---異常處理
EXCEPTION
WHEN OTHERS THEN
-- dbms_output.put_line(SQLERRM);
-- RAISE; 可以添加彈窗
p_log(p_source_table_name => v_source,
p_target_table_name => v_dir,
p_step_name => v_source || ' to ' || v_dir,
p_ROW_COUNT => 0,
p_status => '失敗',
p_start_dt => v_st,
p_end_dt => NULL,
p_mark => SQLERRM);
end;
begin
p_20;
end;-- 查詢?nèi)罩颈? select * from log_table;

select * from emp_1134;

select * from EMP_SUM_SAL;

再次調(diào)用存儲(chǔ)過(guò)程
begin p_20; end;
-- 查詢?nèi)罩颈? select * from log_table;

select * from emp_1134;

select * from EMP_SUM_SAL;

第二次調(diào)用存儲(chǔ)過(guò)程時(shí),因?yàn)閑mp_1134有主鍵,所以當(dāng)?shù)诙蝘nsert到emp_1134時(shí)檢測(cè)到異常,直接拋出,不會(huì)往下走
6.日志表的功能
通過(guò)寫(xiě)日志表,能夠記錄存儲(chǔ)過(guò)程哪一個(gè)步驟執(zhí)行成功,哪一個(gè)步驟執(zhí)行失敗了,以及能記錄 每個(gè)步驟的 執(zhí)行時(shí)間,方便開(kāi)發(fā)者后期對(duì)其優(yōu)化,以及方便,檢查。
- 日志的另一大功能點(diǎn):程序報(bào)錯(cuò)的時(shí)候,記錄程序報(bào)錯(cuò)的步驟 以及 錯(cuò)誤的原因。
- 例如:存儲(chǔ)過(guò)程的同步邏輯(比如源表有10條數(shù)據(jù),日志表中記錄,同步過(guò)去的行數(shù)有20條,說(shuō)明SQL中存在數(shù)據(jù)發(fā)散)
- 練習(xí):全量同步 DEPT 表 到 DEPT_1123,并記錄詳細(xì)的日志信息,以及出現(xiàn)異常,則拋出。
----創(chuàng)建目標(biāo)表
CREATE TABLE dept_1123 AS SELECT * FROM dept WHERE 1 = 2;
----開(kāi)發(fā)存儲(chǔ)過(guò)程
CREATE OR REPLACE PROCEDURE p_dept
IS
v_rowcount NUMBER;
v_start_dt DATE;
v_end_dt DATE;
BEGIN
v_start_dt := SYSDATE;
----清空目標(biāo)表
EXECUTE IMMEDIATE 'truncate table dept_1123';
-----插入數(shù)據(jù)
INSERT INTO dept_1123
SELECT *
FROM dept;
v_rowcount := SQL%ROWCOUNT;
COMMIT;
v_end_dt := SYSDATE;
p_log(p_source_table_name =>'dept',
p_target_table_name => 'dept_1123',
p_step_name =>'dept同步數(shù)據(jù)到dept_1123',
p_ROW_COUNT => v_rowcount,
p_status => 'success',
p_start_dt => v_start_dt,
p_end_dt => v_end_dt,
p_mark =>'執(zhí)行成功');
-------異常處理
EXCEPTION
WHEN OTHERS
THEN dbms_output.put_line(SQLERRM);
p_log(p_source_table_name =>'dept',
p_target_table_name => 'dept_1123',
p_step_name =>'dept同步數(shù)據(jù)到dept_1123',
p_ROW_COUNT => 0,
p_status => 'fail',
p_start_dt => v_start_dt,
p_end_dt => NULL,
p_mark =>SQLERRM);
RAISE;
END;
----調(diào)用
BEGIN
p_dept;
END;
----驗(yàn)證
SELECT * FROM dept_1123;
SELECT * FROM log_table;7.日志表總結(jié)
日志表的模板 以及 調(diào)用寫(xiě)日志存儲(chǔ)過(guò)程 在項(xiàng)目組中已經(jīng)落地好了,我們直接開(kāi)發(fā)存儲(chǔ)過(guò)程里面的同步邏輯,然后對(duì)照著套著寫(xiě)日志就可以了。
日志的核心功能點(diǎn):
- 1.記錄存儲(chǔ)過(guò)程每個(gè)步驟的 開(kāi)始時(shí)間 & 結(jié)束時(shí)間,可以分析寫(xiě)的SQL執(zhí)行的效率高與低
- 2.記錄每個(gè)步驟的執(zhí)行狀態(tài),成功與否,方便我們快速找到報(bào)錯(cuò)的步驟
- 3.記錄每個(gè)步驟的影響行數(shù),驗(yàn)證程序能夠準(zhǔn)確跑出數(shù)據(jù)(如果行數(shù)為0,則說(shuō)明沒(méi)有跑出來(lái)數(shù)據(jù))
- 4.記錄詳細(xì)的報(bào)錯(cuò)步驟以及錯(cuò)誤原因,方便我們快速定位問(wèn)題,解決問(wèn)題
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle數(shù)據(jù)庫(kù)的兩種授權(quán)收費(fèi)方式詳解
現(xiàn)在Oracle有兩種授權(quán)收費(fèi)方式,按CPU(Process)數(shù)和按用戶數(shù)(Named?User?Plus),前一種方式一般用于用戶數(shù)不確定或者用戶數(shù)量很大的情況,典型的如互聯(lián)網(wǎng)環(huán)境,這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)的兩種授權(quán)收費(fèi)方式介紹,需要的朋友可以參考下2022-10-10
Oracle表空間數(shù)據(jù)庫(kù)文件收縮案例解析
這篇文章主要介紹了Oracle表空間數(shù)據(jù)庫(kù)文件收縮案例解析,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
Oracle中rank,over partition函數(shù)的使用方法
本文主要介紹Oracle中rank,over partition函數(shù)的用法,希望對(duì)大家有所幫助。2016-05-05
sql?in查詢?cè)爻^(guò)1000條的解決方案
在oracle數(shù)據(jù)庫(kù)中sql使用in時(shí),如果in的能數(shù)超過(guò)1000就會(huì)出問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于sql?in查詢?cè)爻^(guò)1000條的解決方案,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
Oracle中sys和system的區(qū)別小結(jié)
SYS用戶具有DBA權(quán)限,并且擁有SYS模式,只能通過(guò)SYSDBA登陸數(shù)據(jù)庫(kù)。是Oracle數(shù)據(jù)庫(kù)中權(quán)限最高的帳號(hào) SYSTEM具有DBA權(quán)限。但沒(méi)有SYSDBA權(quán)限。平常一般用該帳號(hào)管理數(shù)據(jù)庫(kù)就可以了。2009-11-11
Oracle數(shù)據(jù)庫(kù)部分遷至閃存存儲(chǔ)的實(shí)現(xiàn)方法
下面小編就為大家分享一篇Oracle數(shù)據(jù)庫(kù)部分遷至閃存存儲(chǔ)的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12

