如何在存储过程中处理DB等异常

时间:2014-03-12 12:38:35

标签: sql oracle oracleexception

我使用以下程序将数据从一个表归档到另一个表。

create or replace PROCEDURE CHECK_TWO AS
  v_insert_count number;
  v_delete_count number;
  v_initial_count number;
BEGIN

   SELECT count(*) into v_initial_count from process_state where tstamp BETWEEN       ADD_MONTHS(trunc(SYSDATE,'MONTH'), -12) AND LAST_DAY(TRUNC(SYSDATE, 'MONTH') - 4);
   dbms_output.put_line(v_initial_count);

   insert into process_state_archive select * from process_state where tstamp BETWEEN ADD_MONTHS(trunc(SYSDATE,'MONTH'), -12) AND LAST_DAY(TRUNC(SYSDATE,  'MONTH') - 4);
   v_insert_count := sql%rowcount;
   dbms_output.put_line(v_insert_count);

   delete process_state where  tstamp BETWEEN ADD_MONTHS(trunc(SYSDATE,'MONTH'), -12) AND LAST_DAY(TRUNC(SYSDATE,  'MONTH') - 4);
   v_delete_count := sql%rowcount;
   dbms_output.put_line(v_delete_count);

   if v_insert_count = v_delete_count AND v_initial_count= v_insert_count then
     commit;
   else
     rollback;
   end if;
END CHECK_TWO;

在此过程中,我想处理服务器不可用或数据库关闭或任何其他环境相关问题等异常。如何在我的存储过程中处理这些方案。有谁能告诉我??

1 个答案:

答案 0 :(得分:0)

看起来你在同一个数据库中处理。因此,如果数据库已关闭,则您的存储过程也不会被执行。但是,如果您正在处理另一个数据库,则可能有很多原因导致数据库关闭。 PL SQL附带预定义的异常列表。你可以看一下。但是,如果您的案例不包括在内,您可以使用以下内容:

DECLARE
  myExceptionName EXCEPTION;
  PRAGMA EXCEPTION_INIT(myExceptionName, <exceptionNumberHere>);
BEGIN
  <your code here>
EXCEPTION
  WHEN myExceptionName THEN
    <handle exception here>
END; 

您可以搜索Oracle中定义的例外号码,并相应地为您的过程添加案例。 Here是Oracle 11g R2的错误消息和数字列表。

相关问题