0

过去,我将 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.

也许问题出在一些语法细节上,但我看不出有什么问题。

有人可以指导我吗?

4

0 回答 0