1

プロジェクトに元にできるログ機能を実装しようとしています。

ユーザーがDELETE_ROWプロシージャを使用してテーブルから行を削除すると、その行からすべての値を選択し、 LOG_DELETED_ROWプロシージャを使用して行の値をxmlとしてシリアル化することにより、row_historyテーブルに挿入し、元のテーブルから行を削除します。

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
)
4

2 に答える 2

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;
 /
于 2012-10-12T17:15:42.443 に答える
0

ここでDBMS_SQLパッケージを使用できると思います。これにより、テーブル名と列を知っている挿入ステートメントを再構築できます。

もう1つのより複雑な方法は、LCR $ _ROW_RECORDオブジェクトをインスタンス化してから、そのEXECUTEメンバーを実行することです。これにより、実際の挿入が実行されます。

于 2012-10-12T17:10:28.977 に答える