我想编写一个SQL IF语句来检查本地临时表是否存在,但这些类型的表不记录在SQL Anywhere系统目录中。
DROP TABLE IF EXISTS t;
BEGIN
DROP TABLE t;
EXCEPTION WHEN OTHERS THEN
END;
ON EXCEPTION RESUME 忽略由SELECT引发的任何异常,并将控制传递给IF语句。
EXECUTE IMMEDIATE 允许您编写一个查询,其中表名在字符串变量中。
TOP 1 确保只选择一行,即使表包含一百万行。
ORDER BY 1 让您满足只有在结果集排序时才能使用TOP的要求。
SELECT 1 解除了指定列名的负担。
INTO @dummy 表示SELECT(因此也是EXECUTE IMMEDIATE)不返回结果集。
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;
尝试无论如何都删除它并忽略错误...
BEGIN
DROP TABLE table;
EXCEPTION WHEN OTHERS THEN
END;