我正在尝试编写一个通用触发器,它将为插入的行提供所有: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'值。
答案 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;
/
使用包含旧值和新值的历史表,它有点复杂但同样的想法