Oracle Stored Procedure example

本文介绍了一个用于从Oracle数据库中读取审计日志并处理的存储过程。该过程可以根据记录ID等条件检索审计信息,并将数据转换后存储到另一个表中以备后续使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

create or replace PROCEDURE ReadAuditItem(sRecordId IN VARCHAR2,
sLoginId IN VARCHAR2 DEFAULT NULL,
sFieldName IN VARCHAR2 DEFAULT NULL,
sNewValue IN VARCHAR2 DEFAULT NULL,
sOldValue IN VARCHAR2 DEFAULT NULL,              
sOperation IN VARCHAR2 DEFAULT NULL,
sResultSet OUT SYS_REFCURSOR
)
AS
new_value VARCHAR2(2000);
old_value VARCHAR2(2000);
column_list VARCHAR2(4000);
suser_id VARCHAR2(15);
slogin VARCHAR2(50);

CURSOR C1 IS
SELECT   s_audit_item.row_id
, s_audit_item.created
, s_audit_item.created_by
, s_audit_item.last_upd
, s_audit_item.last_upd_by
, s_audit_item.modification_num
, s_audit_item.conflict_id
, s_audit_item.buscomp_name
, s_audit_item.operation_cd
, s_audit_item.record_id
, s_audit_item.user_id
, s_audit_item.operation_dt
, s_audit_item.child_bc_name
, s_audit_item.field_name
, s_audit_item.new_val
, s_audit_item.old_val
, s_audit_item.audit_log
FROM LINX_PRD.s_audit_item
WHERE s_audit_item.record_id = sRecordId;

TYPE COLUMN_NAME_TYPE IS REF CURSOR;
column_name_cur COLUMN_NAME_TYPE;

column_name VARCHAR2(200);
field_name VARCHAR2(75);

BEGIN

FOR item IN C1
LOOP

SELECT login INTO slogin
FROM LINX_PRD.s_user WHERE row_id = item.user_id;
IF item.audit_log IS NULL
THEN
INSERT INTO xo_audit_item_t ( row_id
, created
, created_by
, last_upd
, last_upd_by
, modification_num
, conflict_id
, buscomp_name
, operation_cd
, record_id
, user_id
, operation_dt
, child_bc_name
, field_name
, new_val
, old_val
, user_login
)
VALUES (  item.row_id
, item.created
, item.created_by
, item.last_upd
, item.last_upd_by
, item.modification_num
, item.conflict_id
, item.buscomp_name
, item.operation_cd
, item.record_id
, item.user_id
, item.operation_dt
, item.child_bc_name
, item.field_name
, item.new_val
, item.old_val
, slogin
);
GOTO end_loop;
END IF;
GetColumnList(item.audit_log, column_list);

OPEN column_name_cur FOR 
SELECT EXPR
FROM (WITH T AS (SELECT '' || column_list || '' AS TXT FROM DUAL)
SELECT REGEXP_SUBSTR (TXT,
'[^|]+',
1,
LEVEL)
EXPR
FROM T
CONNECT BY LEVEL <=
LENGTH (REGEXP_REPLACE (TXT, '[^|]*')) + 1) X;
LOOP
FETCH column_name_cur into column_name;
EXIT WHEN column_name_cur%NOTFOUND;
FindAuditValues(item.audit_log, column_name, old_value, new_value);

SELECT  s_audit_field.field_name
INTO field_name
FROM LINX_PRD.s_audit_field ,
LINX_PRD.s_audit_buscomp
WHERE s_audit_buscomp.buscomp_name = item.buscomp_name
AND s_audit_field.audit_bc_id = s_audit_buscomp.row_id 
AND s_audit_field.col_name = column_name
AND ROWNUM < 2;
INSERT INTO xo_audit_item_t ( row_id
, created
, created_by
, last_upd
, last_upd_by
, modification_num
, conflict_id
, buscomp_name
, operation_cd
, record_id
, user_id
, operation_dt
, child_bc_name
, field_name
, new_val
, old_val
, user_login
)
VALUES ( item.row_id
, item.created
, item.created_by
, item.last_upd
, item.last_upd_by
, item.modification_num
, item.conflict_id
, item.buscomp_name
, item.operation_cd
, item.record_id
, item.user_id
, item.operation_dt
, item.child_bc_name
, field_name
, old_value
, new_value
, slogin);

END LOOP;
CLOSE column_name_cur;

<<end_loop>> NULL;
END LOOP;


IF sLoginId IS NOT NULL
THEN
SELECT row_id INTO suser_id
FROM LINX_PRD.s_user WHERE sLoginId IS NOT NULL  AND login = sLoginId;
END IF;



OPEN sResultSet FOR SELECT t.* FROM xo_audit_item_t t
WHERE (sFieldName IS NULL OR t.field_name = sFieldName)
AND (sOldValue IS NULL OR t.old_val = sOldValue)
AND (sNewValue IS NULL OR t.new_val = sNewValue)
AND (sOperation IS NULL OR t.operation_cd = sOperation)
AND (suser_id IS NULL OR t.user_id = suser_id)
;

DELETE FROM xo_audit_item_t;

END;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值