是否容易迭代所有:来自Oracle数据库的新值触发执行?

时间:2017-08-09 14:41:08

标签: oracle plsql triggers

我正在尝试编写一个通用触发器,它将为插入的行提供所有:NEW值。最后,我想将它们转换为XML并将XML字符串插入另一个表的二进制字段中。

每个表中有一个可变数量的列 - 多次超过100个字段,总共超过100个表,因此每个表到XML的单独映射非常耗时。

有没有办法引用:NEW伪记录作为列值的集合 - 或者可能是一种传递整体的方法:新记录到存储过程可以将其传递给Java函数(托管在数据库上)可能会使各个值可迭代?

我在这里找到了一个例子: https://docs.oracle.com/database/121/LNPLS/triggers.htm     创建历史记录表并触发:

CREATE TABLE tbl_history ( d DATE, old_obj t, new_obj t)
/
CREATE OR REPLACE TRIGGER Tbl_Trg
  AFTER UPDATE ON tbl
  FOR EACH ROW
BEGIN
  INSERT INTO tbl_history (d, old_obj, new_obj)
  VALUES (SYSDATE, :OLD.OBJECT_VALUE, :NEW.OBJECT_VALUE);
END Tbl_Trg;
/

这似乎暗示将某些值存储为变量的某种方式,但这似乎将它们直接放回数据库表中。我想获得列出的列值的'text'值。

1 个答案:

答案 0 :(得分:1)

您可以创建存储过程来创建触发器

表格tbl

create table tbl (id number, value varchar2(10));

之类的历史记录表
create table tbl_history (d date,id number, value varchar2(10));

你可以像这样创建你的触发器

create or replace procedure CREATE_TRIGGER IS
    trig_str VARCHAR2(32767);
    col_str VARCHAR2(32767) := '(d';
    values_str VARCHAR2(32767) := '(sysdate';
begin
    trig_str := 'CREATE OR REPLACE TRIGGER Tbl_Trg AFTER UPDATE ON tbl FOR EACH ROW'||chr(10)||
    'BEGIN'||chr(10)||chr(9)||'INSERT INTO tbl_history ';

    for col in (
        SELECT column_name FROM all_tab_columns where table_name = 'TBL'
    ) loop
        col_str := col_str||','||col.column_name;
        values_str := values_str||','||':OLD.'||col.column_name;
    end loop;
    col_str := substr(col_str,1,length(col_str)-1)||')';
    values_str := substr(values_str,1,length(values_str)-1)||')';
    trig_str := trig_str||col_str||' VALUES '||values_str||';'||chr(10)||'END;';

    execute immediate trig_str;
END;
/

使用包含旧值和新值的历史表,它有点复杂但同样的想法