2009-05-06 80 views

回答

1

只是尝试反正砸而忽略了错误...

BEGIN
DROP TABLE表;
例外当然其他

END;

3

如果您提出这样的问题,“如果在不存在错误的情况下抛出一个本地临时表,该如何抛出错误?”那么答案很简单:刚落,而忽略任何错误:

BEGIN 
    DROP TABLE t; 
    EXCEPTION WHEN OTHERS THEN 
END; 

如果你真的需要知道问题的答案“是否表t存在吗?”您可以查询表并分析生成的SQLSTATE。下面的函数使得一些功能的使用:

  • ON EXCEPTION RESUME忽略由SELECT引发的任何异常并把控制权交给IF语句。

  • EXECUTE IMMEDIATE允许您在表名称位于字符串变量中的情况下编写查询。

  • TOP 1确保即使表中包含一百万行,也只会选择一行。

  • ORDER BY 1允许您满足只有在订购结果集时才能使用TOP的要求。

  • SELECT 1免除了指定列名称的负担。

  • INTO @dummy表示SELECT(因此EXECUTE IMMEDIATE)不返回结果集。

如果SELECT工作,它要么将SQLSTATE设置为'00000'成功或'02000'找不到行。任何其他的SQLSTATE都意味着表中存在一些严重的问题...就像它不存在一样。

CREATE FUNCTION f_table_is_ok 
    (IN @table_name VARCHAR (128)) 
    RETURNS INTEGER 
    ON EXCEPTION RESUME 
BEGIN 
    DECLARE @dummy INTEGER; 
    EXECUTE IMMEDIATE STRING (
     'SELECT TOP 1 1 INTO @dummy FROM ', 
     @table_name, 
     ' ORDER BY 1'); 
    IF SQLSTATE IN ('00000', '02000') THEN 
     RETURN 1 
    ELSE 
     RETURN 0 
    END IF; 
END; 

下面是一些测试代码:

BEGIN 
DECLARE LOCAL TEMPORARY TABLE tt (c INTEGER); 
DECLARE LOCAL TEMPORARY TABLE "t t" (c INTEGER); 
SELECT f_table_is_ok ('asdf'); 
SELECT f_table_is_ok ('tt'); 
SELECT f_table_is_ok ('"t t"'); 
SELECT f_table_is_ok ('"SYS"."SYSTABLE"'); 
END; 
5

注意,您可以在11.0.1做到这一点,更高:

DROP TABLE IF EXISTS t;