我正在尝试为我的项目实现撤消和日志记录功能。
当用户使用DELETE_ROW过程从表中删除一行时,我从该行中选择所有值并将其插入到我的 row_history 表中,方法是使用LOG_DELETED_ROW过程将行值序列化为 xml,然后我从其原始表中删除行。
使用 Oracle 的内置函数进行序列化很容易,但我找不到反序列化行数据并将其插入回自己的表的方法。
有没有办法将删除的行存储到另一个表中并在需要时恢复它?
删除程序:
create or replace procedure DELETE_ROW(tableName varchar2, userId varchar2, columnName varchar2, columnValue number) is
begin
log_deleted_row(tableName, userId, columnName, columnValue);
execute immediate 'delete from ' || tableName || ' where ' || columnName || ' = ' || columnValue;
end DELETE_ROW;
记录程序:
create or replace procedure LOG_DELETED_ROW(tableName varchar2, userId varchar2, columnName varchar2, columnValue number) is
tableId number;
begin
SELECT ID into tableId FROM TABLES WHERE NAME = tableName;
execute immediate
'INSERT INTO ROW_HISTORY(TABLE_ID,ROW_ID,ROW_DATA)
SELECT
'|| tableId ||',
'|| columnValue ||',
to_clob(
DBMS_XMLGEN.getxmltype(
''SELECT * FROM ' || tableName || ' where ' || columnName || ' = ' || columnValue || '''
)
)FROM DUAL';
end LOG_DELETED_ROW;
行历史表:
create table ROW_HISTORY
(
ID NUMBER not null,
TABLE_ID NUMBER not null,
ROW_ID NUMBER not null,
ROW_DATA CLOB not null
)