请教:本地动态SQL语句编译失败?
本地动态SQL语句编译失败?
     declare
  2  cursor in_pro is select object_name from all_objects where status='INVALID' and object_type='PROCEDURE';
  3  a in_pro%rowtype;
  4  str_cmd varchar2(100);
  5  begin
  6  open in_pro;
  7  loop
  8  fetch in_pro into a;
  9  exit when in_pro%NOTFOUND;
10  str_cmd:='alter procedure '||a.object_name||' compile';
11  execute immediate str_cmd;
12  end loop;
13  close in_pro;
14  end;
15  /
ERROR:
ORA-24344: 成功,但出现编译错误
ORA-06512: 在line 11
警告: PL/SQL 编译错误。上述是一个对未编译过程进行编译,不知错在哪?(SHOW ERROR没有报错)

解决方案 »

  1.   

    str_cmd:='alter procedure ' ¦ ¦a.object_name ¦ ¦' compile'; 
    这句话错了吧,
    动态sql应该放在''中引起来,而且两个单引号代表一个单引号。
      

  2.   

    数据库版本10.2.0.3,编译此过程没有错误。
    执行时出错,主要是因为有些PROCEDURE是属于其他SCHEMA的
    必须在
    str_cmd:='alter procedure ' ¦ ¦a.object_name ¦ ¦' compile'; 
    中加入SCHEMA的名字。
    修改一下,LZ再去测试:
       declare 
      cursor in_pro is select owner,object_name from all_objects where status='INVALID' and object_type='PROCEDURE'; 
      a in_pro%rowtype; 
      str_cmd varchar2(100); 
    begin 
      open in_pro; 
      loop 
      fetch in_pro into a; 
      exit when in_pro%NOTFOUND; 
      str_cmd:='alter procedure ' ¦¦a.owner||'.'||a.object_name ¦¦' compile'; 
      execute immediate str_cmd; 
      end loop; 
      close in_pro; 
    end; 
    / 要求执行该过程的用户拥有可编译存储过程的权限。
      

  3.   

    楼上多谢了,问题出在COMPILE 的PROCEDURE 有问题,因为我写的是匿名块,不是过程,所以有解释,会报错,如果是过程应该是不会报错的.
    还有请教下,如何使匿名块中的语句在报错的情况下,断续执行下一句?
      

  4.   

    你的意思是,用"捕获异常"方式可以断续执行上面的循环语句,能否详细说下?"捕获异常"是EXCEPTION,如何是的话,exception是放在循环外的,不能断续循环吧?