我正在使用下面的过程将数据从一个表归档到另一个表。
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;
在这个过程中,我想处理异常,如服务器不可用或数据库关闭或任何其他环境相关的问题。如何在存储过程中处理这些场景。有人能告诉我吗?
看起来你是在同一数据库内处理。因此,如果数据库关闭,您的存储过程也不会被执行。但是,如果您正在处理另一个数据库,则可能有很多原因导致数据库关闭。在PL SQL中有一个预定义的异常列表。你可以看一下。但是,如果没有包含您的case,则可以使用如下内容:
DECLARE
myExceptionName EXCEPTION;
PRAGMA EXCEPTION_INIT(myExceptionName, <exceptionNumberHere>);
BEGIN
<your code here>
EXCEPTION
WHEN myExceptionName THEN
<handle exception here>
END;
您可以搜索在Oracle中定义的异常编号,并相应地将案例添加到过程中。下面是Oracle 11g R2的错误消息和编号列表。