Курсор для изменчивого стола в Teradata - PullRequest
0 голосов
/ 14 января 2019

У меня есть изменчивая таблица (скажем, vtTempTableForPI), которую я создаю внутри процедуры. После создания изменчивой таблицы я вставляю в нее строки. Когда у меня есть записи в таблице volatile, мне нужно взять MAX(ModifiedDatetime) из этой таблицы volatile (vtTempTableForPI) в локальную переменную. Однако я не могу найти способ сделать это.

Вот фрагмент кода из моей процедуры для некоторого контекста:

SELECT MAX(ModifiedDatetime)
    FROM vtTempTableForPI
    INTO lvMaxUpdateDateTime
    WHERE Template = 'Schedule_Stream'
;

И затем я хочу использовать эту локальную переменную для вставки в другую изменчивую таблицу, как показано ниже:

SET lvQuery = '
    INSERT INTO vtScheduleVersionUpdatedTime
    SELECT
          ''Schedule_Stream''
        , ''' || CAST(lvMaxUpdateDateTime AS VARCHAR(19)) || '''
';
EXECUTE IMMEDIATE lvQuery;

Я не могу использовать этот курсор на энергозависимой таблице, поскольку ее определение не будет присутствовать в DBC, когда мы скомпилируем процедуру, поэтому она выдаст ошибку. Если я пытаюсь использовать динамический запрос, чтобы избежать этой ошибки, я сталкиваюсь с другой ошибкой, как показано ниже:

            SET lvMaxModifiedDateQuery = '
                SELECT MAX(ModifiedDatetime)
                FROM vtTempTableForPI
                WHERE Template = ''Schedule_Tank''
            ';

            PREPARE stMaxModifiedDateQuery03 FROM lvMaxModifiedDateQuery;
            OPEN crGetMaxModifiedDate03;
            FETCH crGetMaxModifiedDate03 INTO lvMaxUpdateDateTime;
            --CLOSE crGetMaxModifiedDate;

            SET lvQuery = '
                INSERT INTO vtScheduleVersionUpdatedTime
                SELECT
                      ''Schedule_Tank''
                    , ''' || CASt(lvMaxUpdateDateTime AS VARCHAR(19)) || '''
            ';
            EXECUTE IMMEDIATE lvQuery;

Ниже приведена ошибка, которую я получаю:

Failure occured while Creating Dynamic Query
                    SQL State:T7688,
                    SQL Code:7688,
                    SQL SESSION:  252898254,
                    Execution Start Time:2019-01-13 21:44:44,
                    Execution End Time:2019-01-13 21:44:54,
                    ERROR Message: Error occurred generating Evl code for dynamic fetch.

Нужна помощь!

1 Ответ

0 голосов
/ 17 января 2019

Какая у тебя версия Teradata? Это хорошо работает для меня:

REPLACE PROCEDURE SP_test(
        IN v_CALC_BASIS  VARCHAR(100))

BEGIN   
   DECLARE lvMaxUpdateDateTime INT;
   DECLARE v_LogStmt VARCHAR(5000);

   SELECT Max(ModifiedDatetime)
       FROM vtTempTableForPI
       INTO lvMaxUpdateDateTime
       WHERE Template = 'Schedule_Stream'
   ;
END;

CALL SP_test ('bla');

CALL Failed.  [3807] SP_TEST:Object 'vtTempTableForPI' does not exist.

Либо создайте изменчивую таблицу перед компиляцией, либо просто переключитесь на глобальную временную таблицу (рекомендуется).

...