我又一个存储过程,在存储过程的开头增加了主表索引失效的sql,结果编译可以通过,但是执行的时候,报如下错误:ORA-00911: invalid character
ORA-06512: at "ADD114.YH_TMQY_MERGER_UPDATE", line 45
ORA-06512: at line 7我的存储过程架构如下:create or replace procedure YH_TMQY_MERGER_Update(
     out_flag out number,
     out_message out varchar2
)
/*
   ......
*/
is
    .......--定义了很多变量,略过。  
    
begin  
   
   v_flag:=0;
   
   execute immediate 'alter table t_customer_tel disable all triggers;';
   --我这里关闭触发器的理由是,我对表的操作丝毫不影响别的业务,所以那些触发器对我毫无意义可言,所以为了效率我要关闭。
   
   ......
   --这里面N多sql,对t_customer_tel进行操作,由于表的触发器太多了,
   --我这里要处理的表的记录也多,如果不关闭触发器的话,就会卡死在这里
   --所以我先关闭所有的触发器,然后执行完毕之后打开所有的触发器。   
   ......
   
   
   --异常处理  
          -- return ;
   execute immediate 'alter table t_customer_tel enable all triggers;';
end YH_TMQY_MERGER_Update;我想在存储过程里面实现自动关闭触发器自动开启触发器的功能操作,如何实现呢?

解决方案 »

  1.   

    execute immediate 'alter table t_customer_tel disable all triggers;';
    execute immediate 'alter table t_customer_tel enable all triggers;';
    -----------------------
    把这两句里面的;去掉。。试试这样:
    execute immediate 'alter table t_customer_tel disable all triggers';
    execute immediate 'alter table t_customer_tel enable all triggers';
      

  2.   


    同意,compile能通过,是因为是动态sql,只有你执行的时候,才能解析这条sql的,所以compile可以通过run的时候,来解析这条sql你这条sql里不应该出现; 所以这里是语法错误。去掉就可以了。
      

  3.   

    编译可以通过,是因为是动态sql的缘故,oracle只检查语法错误,不检查逻辑错误以及执行错误。建议将execute immediate 'alter table t_customer_tel disable all triggers';里面的;去掉。
      

  4.   


    是的哟,动态sql里不同静态sql,compile的时候不会检查这个动态sql的语法,因为是动态的。运行的时候到这里的时候,才会解析这个sql,动态sql不要用;结尾。其实这个和java里的Class.forName("xxx.xxx.xxx")一样。