我正在尝试为我的项目实施撤消和日志记录功能。
当用户使用 DELETE_ROW 过程从表中删除行时,我选择该行中的所有值,并通过将行值序列化为xml并将其插入到我的row_history表中,其中 LOG_DELETED_ROW procedure,然后我从原始表中删除行。
使用Oracle的内置函数进行序列化很容易,但我找不到一种方法来反序列化rowdata并将其插回到自己的表中。
有没有办法将删除的行存储到另一个表中并在需要时还原?
删除程序:
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
)
答案 0 :(得分:2)
DBMS_XMLSAVE似乎是你需要的东西。这是一个应该做你需要做的事情。
CREATE OR REPLACE PROCEDURE insert_xml_data(p_table IN VARCHAR2, xml_data IN CLOB) IS
t_context DBMS_XMLSAVE.CTXTYPE;
t_rows NUMBER;
BEGIN
t_context := DBMS_XMLSAVE.NEWCONTEXT(p_table);
t_rows := DBMS_XMLSAVE.INSERTXML(t_context,xml_data);
DBMS_XMLSAVE.CLOSECONTEXT(t_context);
END;
/
答案 1 :(得分:0)
我相信你可以在这里使用DBMS_SQL包 - 它将允许你重新构建知道表名和列的插入语句。
另一种更复杂的方法是对LCR$_ROW_RECORD对象进行身份验证,然后运行其EXECUTE成员 - 它将执行实际插入。