丢弃表异常间歇性地不起作用

时间:2015-03-18 21:31:49

标签: sql oracle exception-handling

我一直在包装我的" drop table"如果表格不存在,请在下面的块中避免引发942错误:

BEGIN
EXECUTE IMMEDIATE 'DROP TABLE MY_TABLE1';
EXECUTE IMMEDIATE 'DROP TABLE MY_TABLE2';
EXECUTE IMMEDIATE 'DROP TABLE MY_TABLE3';
EXECUTE IMMEDIATE 'DROP TABLE MY_TABLE4';
EXECUTE IMMEDIATE 'DROP TABLE MY_TABLE5';
EXECUTE IMMEDIATE 'DROP TABLE MY_TABLE6';
EXCEPTION
WHEN OTHERS THEN 
IF SQLCODE != -942 THEN RAISE;
END IF;
END;

这大部分时间都很有用。然而,间歇性地似乎拒绝放弃这个或那个表。它并不总是相同的表,并且它并不总是发生在任何特定的查询集中。它恰好发生......有时......由于我无法解释的原因,因此我提出了这个问题。

有没有其他人经历过这个,如果有的话,你做了什么呢?

1 个答案:

答案 0 :(得分:1)

最有可能的原因是我能想到的是另一个会话中的表被锁定(未完成的提交)。报告了什么错误?

你的脚本也有问题 - 如果TABLE1已被删除,则TABLE2 ... 6不会被删除,因为你的第一个DROP将跳转到异常。

最好这样做:

DECLARE
   PROCEDURE drp ( tName IN VARCHAR2 ) IS
   BEGIN
      EXECUTE IMMEDIATE 'drop table ' || tName;
   EXCEPTION
      WHEN OTHERS THEN 
         IF SQLCODE != -942 THEN RAISE;
      END IF;
   END;
BEGIN
   drp ( 'TABLE1' );
   drp ( 'TABLE2' );
   drp ( 'TABLE3' );
   -- etc
END;