检查 teradata 中是否存在 volatile table
check if volatile table exists in teradata
Volatile table 很棒,可以与 sql 服务器中的临时 tables 相提并论(我的背景)。有没有办法检查 volatile table 是否已经存在?此代码在第一次 运行 时将不起作用:
DROP TABLE SomeVolatileTable;
CREATE VOLATILE TABLE SomeVolatileTable AS
(
SELECT
TOP 10 *
FROM SomeSourceTable
) WITH DATA ON COMMIT PRESERVE ROWS;
在 sql 服务器中,您可以检查是否存在临时 table:
IF OBJECT_ID('tempdb..#SomeTempTable') IS NOT NULL DROP TABLE #SomeTempTable
Teradata 中是否存在类似的东西?
除了 HELP VOLATILE TABLE
which returns all VT.
之外,无法检查是否存在特定的 Volatile Table
但是您可以创建如下所示的存储过程:
/*
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;
它只会忽略Table不存在错误,但仍然会因无效权限等而失败
如果您使用自己的用户作为数据库调用它,它也适用于 Volatile Tables:
CALL drop_table_if_exists(USER,'SomeVolatileTable', msg);
与其在尝试创建它们之前删除它们,不如在完成后将它们删除到脚本中。这将始终有效,将允许您重新运行而不会出现问题,并将释放 volatile table.
使用的假脱机 space
您可以使用此存储过程来检查是否存在可变 table:
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,"table does not exist exception" 尽管已处理,但会导致您的事务作为副作用回滚。我不知道有什么方法可以防止这种情况发生。
Volatile table 很棒,可以与 sql 服务器中的临时 tables 相提并论(我的背景)。有没有办法检查 volatile table 是否已经存在?此代码在第一次 运行 时将不起作用:
DROP TABLE SomeVolatileTable;
CREATE VOLATILE TABLE SomeVolatileTable AS
(
SELECT
TOP 10 *
FROM SomeSourceTable
) WITH DATA ON COMMIT PRESERVE ROWS;
在 sql 服务器中,您可以检查是否存在临时 table:
IF OBJECT_ID('tempdb..#SomeTempTable') IS NOT NULL DROP TABLE #SomeTempTable
Teradata 中是否存在类似的东西?
除了 HELP VOLATILE TABLE
which returns all 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;
它只会忽略Table不存在错误,但仍然会因无效权限等而失败
如果您使用自己的用户作为数据库调用它,它也适用于 Volatile Tables:
CALL drop_table_if_exists(USER,'SomeVolatileTable', msg);
与其在尝试创建它们之前删除它们,不如在完成后将它们删除到脚本中。这将始终有效,将允许您重新运行而不会出现问题,并将释放 volatile table.
使用的假脱机 space您可以使用此存储过程来检查是否存在可变 table:
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,"table does not exist exception" 尽管已处理,但会导致您的事务作为副作用回滚。我不知道有什么方法可以防止这种情况发生。