过去,我将 SQL Server 存储过程中的游标改编为 Teradata,但尝试使用时遇到了一些麻烦。我的程序代码是:
CREATE PROCEDURE sp_QrRnTables()
BEGIN
DECLARE varTableOldName VARCHAR(500);
DECLARE varTableNewName VARCHAR(500);
DECLARE vardbName VARCHAR(100);
DECLARE varIDCod VARCHAR(5);
DECLARE varRename VARCHAR(100);
DECLARE varCt INT DEFAULT 0;
DECLARE renameTables CURSOR
FOR
SELECT
nomeDB
,nomeTabela
FROM (
SELECT
DatabaseName AS nomeDB
,TableName AS nomeTabela
,LastAccessTimeStamp AS dtUltimoAcesso
,(CURRENT_DATE - CAST(LastAccessTimeStamp AS DATE)) AS diasSemAcesso
FROM
DBC.TablesV
WHERE
1=1
AND TableKind = 'T'
AND DatabaseName IN ('P_BACKUP')
GROUP BY
DatabaseName
,TableName
,LastAccessTimeStamp
,LastAlterTimeStamp
) tbHig
WHERE diasSemAcesso IS NULL OR diasSemAcesso >= 180
ORDER BY nomeDB, nomeTabela
FOR READ ONLY;
OPEN renameTables;
FETCH NEXT FROM renameTables INTO vardbName, varTableOldName;
WHILE (SQLCODE = 0)
DO
SET varTableNewName = vardbName || '.' || vardbName || '_V' || CAST(EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AS VARCHAR(20)) || '_' || CAST(varCt AS VARCHAR(20));
SET varTableOldName = vardbName || '.' || varTableOldName;
SET varRename = 'RENAME TABLE ' || varTableOldName || ' TO ' || varTableNewName;
EXECUTE IMMEDIATE varRename;
SET varCt = varCt + 1;
FETCH NEXT FROM renameTables INTO vardbName, varTableOldName;
END WHILE;
CLOSE renameTables;
END;
目标是收集一系列表的名称并使用游标逻辑重命名它们。像这样:如果我的数据库“myTableA”、“myTableB”、“myTableC”上有三个表,我希望通过游标逻辑将它们重命名为“P_BACKUP_V2021_0”、“P_BACKUP_V2021_1”、“P_BACKUP_V2021_2”。
当我尝试调用该过程时会出现问题。只有第一行执行有效,然后当游标尝试继续执行时显然返回错误:
Executed as Single statement. Failed [3722 : HY000] SP_QRRNTABLES:Only a COMMIT WORK or null statement is legal after a DDL Statement.
Elapsed time = 00:00:05.668
STATEMENT 1: Unknown failed.
也许问题出在一些语法细节上,但我看不出有什么问题。
有人可以指导我吗?