2010-04-22 5 views
0

Я хочу использовать переменные внутри моего макроса SQL на Teradata.Как использовать переменные в Teradata SQL Макросы

Я думал, что я мог бы сделать что-то вроде следующего:

REPLACE MACRO DbName.MyMacro 
( 
    MacroNm VARCHAR(50) 
) 
AS 
( 

    /* Variable to store last time the macro was run */ 

    DECLARE V_LAST_RUN_DATE TIMESTAMP; 


    /* Get last run date and store in V_LAST_RUN_DATE */ 

    SELECT LastDate 
    INTO V_LAST_RUN_DATE 
    FROM DbName.RunLog 
    WHERE MacroNm = :MacroNm; 


    /* Update the last run date to now and save the old date in history */ 

    EXECUTE MACRO DbName.RunLogUpdater( 
     :MacroNm 
    ,V_LAST_RUN_DATE 
    ,CURRENT_TIMESTAMP 
    ); 

); 

Однако, это не сработало, так что я думал об этом, вместо того, чтобы:

REPLACE MACRO DbName.MyMacro 
( 
    MacroNm VARCHAR(50) 
) 
AS 
( 

    /* Variable to store last time the macro was run */ 

    CREATE VOLATILE TABLE MacroVars AS 
    ( 
     SELECT LastDate AS V_LAST_RUN_DATE 
      FROM DbName.RunLog 
      WHERE MacroNm = :MacroNm; 
    ) 
    WITH DATA ON COMMIT PRESERVE ROWS; 


    /* Update the last run date to now and save the old date in history */ 

    EXECUTE MACRO DbName.RunLogUpdater( 
     :MacroNm 
    ,SELECT V_LAST_RUN_DATE FROM MacroVars 
    ,CURRENT_TIMESTAMP 
    ); 

); 

Я могу делать то, что я ищет с сохраненной процедурой, однако я хочу избежать производительности.

У вас есть идеи по этому вопросу?
Есть ли что-нибудь еще, что я могу попробовать?

Приветствия
Tim

+0

Из-за любопытства, какими проблемами с производительностью является ваш хранимый процесс, вызывающий? – lins314159

ответ

1

Вы не можете объявить переменную внутри макроса. То, что вы пытаетесь выполнить, может быть обработано с помощью инструкции UPDATE, если вы этого захотите.

UPDATE TGT 
FROM <dbname>.<target table> TGT 
    , (SELECT MacroName 
      , LastRunDate 
     FROM <dname>.<source table> 
    ) SRC 
SET LastRunDate = SRC.LastRunDate 
    , EffectiveTimestamp = CURRENT_TIMESTAMP(0) 
WHERE TGT.MacroName = SRC.MacroName 
;