微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么异常会通过我循环出光标?

如何解决为什么异常会通过我循环出光标?

我有一个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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?