一旦在main中修改了日期列,下面的触发器会将除col1
之外的所有列从主表复制到hist表。
我打算在main和hist中添加更多列,但每次执行此操作时都需要修改触发器。有什么方法可以让我的触发器选择主要出现在除col1之外的所有列吗?
CREATE OR REPLACE TRIGGER ins_his BEFORE UPDATE OF datetime ON main
FOR EACH ROW
BEGIN
INSERT INTO hist (col2,col3) VALUES ( :new.col2, :new.col3 );
END;
答案 0 :(得分:0)
我会给你一个方法,可以引导你找到解决方案。这段代码真的没有经过测试,因为我现在没有时间去做,但我希望它可以帮到你......
1)创建一个这样的游标:
declare v_table_name varchar2(30) := 'HIST';
cursor cur is select column_name, data_type
from all_tab_columns
where table_name = v_table_name
and column_name != 'COL1'
order by column_id;
在那里,您可以获得表格HINT的所有当前列,当然,这将考虑您所做的任何更改表。
2)您必须获取该游标并创建动态插入语句。像这样:
declare v_column_list varchar2(500);
declare v_values_list varchar2(500);
for i in cur loop
v_column_list := v_column_list||','||i.column_name;
v_values_list := v_values_list||', :new.'||i.column_name;
end loop;
3)创建动态插入语句并执行它:
declare csql varchar2(500);
csql := 'INSERT INTO '||v_table_name||' ('||v_column_list||') VALUES ('||v_values_list||')';
EXECUTE IMMEDIATE (csql);
希望这会有所帮助......