2012-10-12 4 views
1

Я пытаюсь реализовать отменить и регистрация функция для моего проекта.Вставка значений строк в столбец другой таблицы

Когда пользователь удаляет строку из таблицы с DELETE_ROW процедуры я выбрать все значения из этой строки и вставить его в мою row_history таблицу по сериализации значения строки в XML с LOG_DELETED_ROW процедуры, то я удалить строку из его оригинальная таблица.

Сериализация со встроенными функциями 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; 

Logging:

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; 

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

Почему вы не можете использовать триггеры? Триггер по удалению для регистрации удаляемых строк. Каковы ваши критерии восстановления (из таблицы журналов)? – Annjawn

+0

С или без триггеров, мой вопрос в том, как я могу вставить значения строки в другую таблицу? И при необходимости я хочу получить эту строку из таблицы журналов и вставить ее в ее исходную таблицу. Я пытаюсь найти способ сериализации/десериализации строки. –

+0

Почему вы храните xml как clob? –

ответ

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; 
/
0

Я считаю, что вы можете использовать пакет DBMS_SQL здесь - это позволит вам восстановить инструкцию insert, известную имя таблицы и столбцы.

Другим, более сложным способом было бы нагрузить объект LCR$_ROW_RECORD, а затем запустить его элемент EXECUTE - он будет выполнять фактическую вставку.

Смежные вопросы