检查teradata中是否存在易失性表

cs0*_*815 4 teradata

易失性表很好,有点类似于sql server(我的背景)中的临时表.有没有办法检查是否已存在易失性表?第一次运行时,此代码无效:

DROP TABLE SomeVolatileTable;
CREATE VOLATILE TABLE SomeVolatileTable AS
(
    SELECT 
        TOP 10 *
    FROM  SomeSourceTable
) WITH DATA ON COMMIT PRESERVE ROWS;
Run Code Online (Sandbox Code Playgroud)

在SQL Server中,您可以检查是否存在临时表:

IF OBJECT_ID('tempdb..#SomeTempTable') IS NOT NULL DROP TABLE #SomeTempTable
Run Code Online (Sandbox Code Playgroud)

Teradata中存在类似的东西吗?

dno*_*eth 5

没有办法检查是否存在特定的易失性表,除此之外还HELP VOLATILE TABLE返回所有 VT.

但您可以创建一个如下所示的存储过程:

/*
   Drop a table ignoring 3807 error (Table doesn't exist)
*/

REPLACE PROCEDURE drop_table_if_exists
(
  IN db_name VARCHAR(128) CHARACTER SET Unicode,
  IN tbl_name VARCHAR(128) CHARACTER SET Unicode,
  OUT msg VARCHAR(400) CHARACTER SET Unicode
) SQL SECURITY INVOKER
BEGIN
   DECLARE full_name VARCHAR(361)  CHARACTER SET Unicode;

   DECLARE sql_stmt VARCHAR(500)  CHARACTER SET Unicode;
   DECLARE exit HANDLER FOR SqlException
   BEGIN
      IF SqlCode = 3807 THEN SET msg = full_name || ' doesn''t exist.';
      ELSE
        RESIGNAL;
      END IF;
   END;

   SET full_name = '"' || Coalesce(db_name,DATABASE) || '"."' || tbl_name || '"';

   SET sql_stmt = 'DROP TABLE ' || full_name || ';';

   EXECUTE IMMEDIATE sql_stmt;

   SET msg = full_name || ' dropped.';
END;
Run Code Online (Sandbox Code Playgroud)

它只会忽略表不存在的错误,但仍然无效的权限等.

如果您使用自己的用户作为数据库调用它,它也适用于Volatile Tables:

CALL drop_table_if_exists(USER,'SomeVolatileTable', msg);
Run Code Online (Sandbox Code Playgroud)

  • @csetzkorn:请您的 DBA 创建它,这是安全的,因为它只会删除提交用户具有 DROP TABLE 权限的表。 (2认同)