Следующий скрипт создает пакет и таблицы для записи логов.
Логи пишутся в двух режимах:
1. логи которые откатываются при откате транзакции
2. логи которые коммитятся в автономной транзакции и которые невозможно откатить.
DROP SEQUENCE seq_tbl_system_log
/
DROP SEQUENCE seq_tbl_log
/
DROP TABLE tbl_log
/
DROP TABLE tbl_system_log
/
CREATE SEQUENCE seq_tbl_system_log
/
CREATE TABLE tbl_system_log(
id INTEGER CONSTRAINT pk_tbl_system_log PRIMARY KEY,
name VARCHAR2(30) NOT NULL CONSTRAINT un_tbl_system_log UNIQUE
)
/
CREATE SEQUENCE seq_tbl_log
/
CREATE TABLE tbl_log(
id INTEGER CONSTRAINT pk_tbl_log PRIMARY KEY,
system_log_id INTEGER NOT NULL,
message VARCHAR2(4000) NOT NULL,
log_type_id INTEGER NOT NULL,
ts TIMESTAMP DEFAULT SYSDATE NOT NULL,
CONSTRAINT fk_tbl_log_tbl_system_log FOREIGN KEY (system_log_id) REFERENCES tbl_system_log (id)
)
/
CREATE OR REPLACE FORCE VIEW v_log
AS
SELECT tllg.id
, tslg.name
, tllg.message
, DECODE(tllg.log_type_id, 1, 'INFO', 2, 'WARNING', 3, 'ERROR') log_type
, tllg.ts
FROM tbl_log tllg
JOIN
tbl_system_log tslg
ON tllg.system_log_id = tslg.id
/
CREATE OR REPLACE PACKAGE pkg_log IS
PROCEDURE reg_system_log
(p_name IN VARCHAR2);
FUNCTION get_system_log_id
(p_name IN VARCHAR2)
RETURN NUMBER;
PROCEDURE ins_log_info
(p_system_log_id IN NUMBER,
p_message IN VARCHAR2);
PROCEDURE ins_log_info_autonomous
(p_system_log_id IN NUMBER,
p_message IN VARCHAR2);
PROCEDURE ins_log_warning
(p_system_log_id IN NUMBER,
p_message IN VARCHAR2);
PROCEDURE ins_log_warning_autonomous
(p_system_log_id IN NUMBER,
p_message IN VARCHAR2);
PROCEDURE ins_log_error
(p_system_log_id IN NUMBER,
p_message IN VARCHAR2);
PROCEDURE ins_log_error_autonomous
(p_system_log_id IN NUMBER,
p_message IN VARCHAR2);
PROCEDURE del_log
(p_id IN NUMBER);
PROCEDURE del_log_autonomous
(p_id IN NUMBER);
END pkg_log;
/
CREATE OR REPLACE PACKAGE BODY pkg_log
IS
PROCEDURE reg_system_log
(p_name IN VARCHAR2)
IS
BEGIN
INSERT INTO tbl_system_log
(id,
name)
VALUES(
seq_tbl_system_log.NEXTVAL,
p_name);
END;
FUNCTION get_system_log_id
(p_name IN VARCHAR2)
RETURN NUMBER
IS
l_id NUMBER;
BEGIN
SELECT id
INTO l_id
FROM tbl_system_log
WHERE name = p_name;
RETURN l_id;
END;
PROCEDURE ins_log
(p_system_log_id IN NUMBER,
p_message IN VARCHAR2,
p_log_type_id IN NUMBER)
IS
BEGIN
INSERT INTO tbl_log
(id,
system_log_id,
message,
log_type_id)
VALUES(
seq_tbl_log.NEXTVAL,
p_system_log_id,
p_message,
p_log_type_id);
END;
--- INFO -----------------------------------
PROCEDURE ins_log_info
(p_system_log_id IN NUMBER,
p_message IN VARCHAR2)
IS
BEGIN
ins_log(p_system_log_id, p_message, 1);
END;
PROCEDURE ins_log_info_autonomous
(p_system_log_id IN NUMBER,
p_message IN VARCHAR2)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
ins_log(p_system_log_id, p_message, 1);
COMMIT;
END;
--- WARNING -------------------------------
PROCEDURE ins_log_warning
(p_system_log_id IN NUMBER,
p_message IN VARCHAR2)
IS
BEGIN
ins_log(p_system_log_id, p_message, 2);
END;
PROCEDURE ins_log_warning_autonomous
(p_system_log_id IN NUMBER,
p_message IN VARCHAR2)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
ins_log(p_system_log_id, p_message, 2);
COMMIT;
END;
--- ERROR ---------------------------------
PROCEDURE ins_log_error
(p_system_log_id IN NUMBER,
p_message IN VARCHAR2)
IS
BEGIN
ins_log(p_system_log_id, p_message, 3);
END;
PROCEDURE ins_log_error_autonomous
(p_system_log_id IN NUMBER,
p_message IN VARCHAR2)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
ins_log(p_system_log_id, p_message, 3);
COMMIT;
END;
--- DELETE -----------------------------
PROCEDURE del_log
(p_id IN NUMBER)
IS
BEGIN
DELETE FROM tbl_log
WHERE id = p_id;
END;
PROCEDURE del_log_autonomous
(p_id IN NUMBER)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
del_log(p_id);
COMMIT;
END;
END pkg_log;
/