我对一张表INSERT时,TRIGGER调用一个存储过程..PROCEDURE的 作用是:从我要INSERT的动态产生的记录中取出数据,根据这些数据中不同的表名参数,创建不同的表,然后通过CURSOR.动态的向对应的表插入数据...
我现在的问题就是..运行的时候..走到插入数据的地方就报错::说表或视图不存在!!!!!!!!!!!!!...我知道.TRIGGER是自治事务..里面不能有COMMIT..不能有ALTER.CREATE...想不出解决办法了.....求教了!

解决方案 »

  1.   

    TRIGGER里面可以ALTER.CREATE啦,不过你要用动态SQL语句。用execute immediate 执行就可以了
      

  2.   

    必须使用自治事务
    如:SQL> create or replace procedure p_createview(v_sql varchar2) 
      2  as
      3  pragma autonomous_transaction; --注意,此部分为独立事务处理
      4  begin
      5    execute immediate v_sql;
      6  end p_createview;
      7  /过程已创建。已用时间:  00: 00: 01.02
      

  3.   

    1、execute immediate ..我用过了 没有 。。
    2、pragma autonomous_transaction。。我也用过了表没有COMMIT不能对它进行操作,,没有呀!
      

  4.   

    深夜旧地重游csdn oracle版,又见bzszp(SongZip)兄,近来可好?sasacat(傻傻猫)原来也搞oracle,没想到,也问个好!to 楼主:bzszp(SongZip)的建议完全正确,下面是测试代码SQL> create table tbl_test_tri
      2  (val1 varchar2(10));
    Table created.SQL> create or replace procedure prc_test_tri (v_sql varchar2) as
      2     pragma autonomous_transaction;
      3  begin
      4     execute immediate v_sql;
      5  end prc_test_tri;
      6  /
    Procedure created.SQL> create or replace trigger tri_test
      2     before insert
      3     on tbl_test_tri
      4     for each row
      5  declare
      6     w_tblname   varchar2 (100);
      7  begin
      8     if :new.val1 = 't1' then
      9        w_tblname := 'table1';
     10     elsif :new.val1 = 't2' then
     11        w_tblname := 'table2';
     12     end if;
     13  
     14     prc_test_tri ('create table ' || w_tblname || ' (col1 varchar2(10))');
     15  
     16     execute immediate 'insert into ' || w_tblname || ' col1 values (''' || :new.val1
     17                       || ''')';
     18  end;
     19  /
    Trigger created.SQL> insert into tbl_test_tri (val1) values ('t1');1 row created.SQL> insert into tbl_test_tri (val1) values ('t2');1 row created.SQL> select * from tbl_test_tri;VAL1
    ----------
    t1
    t2SQL> select * from table1;COL1
    ----------
    t1SQL> select * from table2;COL1
    ----------
    t2当然,具体的逻辑还是要你自己写
      

  5.   

    KingSunSha(弱水三千) 哎,是啊,最近一个月开始学ORACLE,已经在这个版丢了无数次人了:(