我一直在包装我的" 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;
这大部分时间都很有用。然而,间歇性地似乎拒绝放弃这个或那个表。它并不总是相同的表,并且它并不总是发生在任何特定的查询集中。它恰好发生......有时......由于我无法解释的原因,因此我提出了这个问题。
有没有其他人经历过这个,如果有的话,你做了什么呢?
答案 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;