如何在SQL Anywhere中检查临时表是否存在?

3
我想编写一个SQL IF语句来检查本地临时表是否存在,但这些类型的表不记录在SQL Anywhere系统目录中。
3个回答

5
请注意,您可以在11.0.1及更高版本中执行此操作:
DROP TABLE IF EXISTS t;

3
如果您正在问这个问题:“如何在不引发错误的情况下删除本地临时表?”那么答案很简单:只需DROP它并忽略任何错误即可。
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; 

1

尝试无论如何都删除它并忽略错误...

BEGIN
DROP TABLE table;
EXCEPTION WHEN OTHERS THEN

END;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接