触发选择除一个之外的所有列?

时间:2013-12-19 10:22:09

标签: sql oracle triggers

一旦在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;

1 个答案:

答案 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);

希望这会有所帮助......