检查teradata

时间:2016-09-29 12:10:39

标签: teradata

易失性表很好,有点类似于sql server(我的背景)中的临时表。有没有办法检查是否已存在易失性表?这段代码第一次运行时不会起作用:

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

在sql server中,您可以检查是否存在临时表:

IF OBJECT_ID('tempdb..#SomeTempTable') IS NOT NULL DROP TABLE #SomeTempTable

Teradata中是否存在类似内容?

3 个答案:

答案 0 :(得分: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;

它只会忽略表不存在错误,但仍会因无效权限等而失败。

如果您将自己的用户称为数据库,则它也适用于易失性表:

CALL drop_table_if_exists(USER,'SomeVolatileTable', msg);

答案 1 :(得分:1)

在尝试创建它们之前,不要先删除它们,而是在完成它们之后在脚本中删除它们。这将始终有效,将允许您重新运行而不会出现问题,并将释放易失性表使用的假脱机空间。

答案 2 :(得分:1)

您可以使用此存储过程来检查是否存在易失表:

REPLACE PROCEDURE test_db.VOLATILE_EXISTS(
  IN volatile_table_name varchar(30),
  OUT exists_ind integer -- 1 if it exists, else 0
)
SQL SECURITY INVOKER
BEGIN
  DECLARE ignored_condition varchar(100) default '';
  DECLARE table_does_not_exist CONDITION FOR SQLSTATE '42000';
  DECLARE sql_string varchar(100);

  DECLARE CONTINUE HANDLER FOR table_does_not_exist
     SET ignored_condition = 'table does not exist';

  SET exists_ind = 0;
  SET sql_string =  'select 1 from '||volatile_table_name||' where 1=0';
  BEGIN
    DECLARE c1 CURSOR FOR s1;
    PREPARE s1 FROM sql_string;
    OPEN c1;
  END;

  IF ignored_condition = '' THEN
    SET exists_ind = 1;
  END IF;
END;

请注意,如果VT不存在,并且您在BEGIN TRANSACTION / END TRANSACTION中调用此SP,则尽管处理了“表不存在异常”,但将导致您的事务回滚,这是一个副作用。我不知道一种防止这种情况的方法。