表test中字段id,name,tablename
其中字段tanblename中存储的是需要插入的表名,建立以下触发器时不能通过编译
create or replace trigger tri_i_test 
after  insert on  test for each row
declare 
begin
if :new.ID>1 then
insert into :new.tablename||(col1,col2) values (:new.id,:new.name);
end if;
end;

解决方案 »

  1.   

    insert into :new.tablename||(col1,col2) values (:new.id,:new.name);
    是什么意思哦?  没懂! 需求说清楚点,col1和col2 咋来的哦
      

  2.   


    --我明白了
    create or replace trigger tri_i_test  
    before insert on test 
    for each row
    declare  
    sql_str varchar2(100);
    begin
         if :new.ID>1 then
            sql_str:='insert into '||:new.tablename||'(col1,col2) values ('||:new.id||','||:new.name||')';
            execute immediate sql_str;
         end if;
    end;
      

  3.   

    --修改了一下2楼的代码
    create or replace trigger tri_i_test  
    before insert on test 
    for each row
    declare  
    sql_str varchar2(100);
    begin
         if :new.ID>1 then
            sql_str:='insert into '||:new.tablename||'(col1,col2)
             values ('||:new.id||','''||:new.tablename||''')';
            execute immediate sql_str;
         end if;
    end;
      

  4.   

    就看楼主col1和col2是什么数据类型了
      

  5.   


    create or replace trigger tri_i_test  
    before insert on test 
    --after 当你插入的时候:new.id已经是你插入到表中的数据成为了:old.id 了。
    --before 时你的:new.id 在你的内存中。还没有插入到你的表中。之处用before
    for each row
    declare  
    sql_str varchar2(100);
    begin
         if :new.ID>1 then
            sql_str:='insert into '||:new.tablename||'(col1,col2)
             values ('||:new.id||','''||:new.tablename||''')';
            execute immediate sql_str;
         end if;
    end;
      

  6.   

    create or replace trigger tri_i_test  
    after insert on test for each row
    declare
    v_sql varchar2(1000);  
    begin
    v_sql:='insert into  '||:new.tablename(col1,col2)||'  values('||:new.id||','||:new.name||')';
    if :new.ID>1 then
    execute immediate v_sql;
    end if;
    exception 
    when others then
    dbms_output.put_line('表的字段与值类型不符合');
    end;