如何解决为什么异常会通过我循环出光标?
我有一个PL / sql oracle过程, 我在sql_id列表上运行以对其进行调整。 我有一个例外,但它贯穿了我并完成。 尝试是否继续进行,但相同。 有任何想法吗?
CREATE OR REPLACE Procedure sql_perf_for_sql_id
IS
v_sql_id VARCHAR2(13);
stmt_task VARCHAR2(64 CHAR);
retcode VARCHAR2(64 CHAR);
cursor c1 is
SELECT sql_ID
FROM sql_for_tune
WHERE tuned='NO';
BEGIN
IF c1%ISOPEN THEN
CLOSE c1 ;
END IF;
open c1;
LOOP
--for r_c1 in c1 loop
BEGIN
fetch c1 into v_sql_id;
--v_sql_id := r_c1.sql_id;
exit when c1%notfound;
update sql_for_tune set remarks='RUNNING' where sql_id=v_sql_id;
commit;
stmt_task := NULL;
DBMS_OUTPUT.PUT_LINE (v_sql_id);
-- create a tuning task tune the statement
stmt_task := DBMS_sqlTUNE.CREATE_TUNING_TASK(sql_id => v_sql_id);
DBMS_OUTPUT.PUT_LINE( NVL(stmt_task,'Error CREATE_TUNING_TASK() Return Value'));
-- execute the resulting task
retcode := DBMS_sqlTUNE.EXECUTE_TUNING_TASK(stmt_task);
DBMS_OUTPUT.PUT_LINE( NVL(retcode,'Error EXECUTE_TUNING_TASK() Return Value'));
-- accept the resulting task
retcode := DBMS_sqlTUNE.ACCEPT_sql_PROFILE(stmt_task);
DBMS_OUTPUT.PUT_LINE( NVL(retcode,'Error ACCEPT_sql_PROFILE() Return Value'));
-- Optional SELECT DBMS_sqlTUNE.report_tuning_task( stmt_task ) AS recommendations FROM dual;
update sql_for_tune set tuned='YES',task_name = stmt_task,index_benefit=(SELECT max( r.benefit/100)
FROM dba_advisor_actions a,dba_advisor_recommendations r
WHERE a.task_name=stmt_task
AND a.task_id = r.task_id
AND a.rec_id = r.rec_id
and a.command='CREATE INDEX'),profile_benefit=(SELECT max( r.benefit/100)
FROM dba_advisor_actions a,dba_advisor_recommendations r
WHERE a.task_name=stmt_task
AND a.task_id = r.task_id
AND a.rec_id = r.rec_id
and a.command='ACCEPT sql PROFILE')
where sql_id=v_sql_id;
commit;
update sql_for_tune set remarks='END' where sql_id=v_sql_id;
commit;
EXCEPTION
WHEN OTHERS THEN
update sql_for_tune set tuned='CHECK',task_name = stmt_task where sql_id=v_sql_id;
commit;
raise_application_error(-20001,'An error was encountered - '||sqlCODE||' -ERROR- '||sqlERRM);
--continue;
END;
END LOOP;
close c1;
END;
sql> execute sql_perf_for_sql_id;
BEGIN sql_perf_for_sql_id; END;
*
ERROR at line 1:
ORA-20001: An error was encountered - -13786 -ERROR- ORA-13786: missing sql
text of statement object "1" for tuning task "TASK_464272"
ORA-06512: at "sql_PERF.sql_PERF_FOR_sql_ID",line 73
ORA-06512: at line 1
sql>
谢谢
解决方法
由于以下原因退出
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
如果您希望循环继续进行,请不要引发错误-使用其他方式记录该错误(例如,dbms_output.put_line
是最简单的;通过使用自治事务的调用将其存储到表中过程)。
另外,从循环中删除所有这些COMMITs
。在过程结束时提交一次。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。