2009-05-06 65 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;