请教:本地动态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没有报错)
本地动态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没有报错)
这句话错了吧,
动态sql应该放在''中引起来,而且两个单引号代表一个单引号。
执行时出错,主要是因为有些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;
/ 要求执行该过程的用户拥有可编译存储过程的权限。
还有请教下,如何使匿名块中的语句在报错的情况下,断续执行下一句?