Оператор DDL параллельного транспортера Teradata — отсутствует { EXTENDED_LITERAL_ CHAR_STRING_LITERAL_ } в правиле: ОШИБКА литерала символьной строки

#teradata #ddl

Вопрос:

Что я хочу сделать, так это проверить в своей базе данных, существует ли моя таблица, если да, удалите ее. Вот мой .tpt :

 DEFINE JOB DELETE_ET_TABLES
DESCRIPTION 'Delete ET tables'
(
        DEFINE OPERATOR DDL_OPERATOR
          DESCRIPTION 'Teradata Parallel Transporter DDL Operator'
          TYPE DDL
          ATTRIBUTES
          (
                varchar TdpId = @TERADATA_TDP,
                varchar UserName = @User,
                varchar UserPassword = @Pwd
          );

        APPLY  
                'SELECT (CASE WHEN TableName = ''Test_Del'' 
                              THEN (''DROP TABLE @Table;'')
                              ELSE NULL
                         END)
                 FROM dbc.TablesV WHERE databasename = @Db;'  TO OPERATOR(DDL_OPERATOR);
 

И это сообщение об ошибке, которое я получаю :

 Running "tbuild" command: tbuild -f /$HOME/loaders/test_deleteETTables.tpt -u TERADATA_TDP=$TDP, TERADATA_DATABASE=$DB -L /$LOG/
Teradata Parallel Transporter Version 16.20.00.09 64-Bit
TPT_INFRA: Syntax error at or near line 18 of Job Script File '/$HOME/loaders/test_deleteETTables.tpt':
TPT_INFRA: At "(" missing { EXTENDED_LITERAL_ CHAR_STRING_LITERAL_ } in Rule: Character String Literal
Compilation failed due to errors. Execution Plan was not generated.
 

У тебя есть какие-нибудь идеи ? Я пробовал несколько вещей, таких как :

 SELECT 1 FROM dbc.TablesV WHERE databasename = @Db AND TABLENAME ='TEST_DEL';
CASE WHEN ACTIVITYCOUNT = 1
    THEN (DROP TABLE @Table)
    ELSE ( QUIT )
END;
 

Все мои переменные были объявлены. Я чувствую, что это проблема с использованием одинарных кавычек внутри утверждения que, но я не уверен и не знаю, как ее решить. Большое вам спасибо за потраченное время.

Комментарии:

1. Есть ли у ваших символьных переменных, таких как @db, одинарные кавычки?

2.Я думаю, что это связано с использованием NULL, но SELECT недопустимо для оператора DDL. Рекомендуемый способ сделать это-просто передать a DROP оператору и сказать ему игнорировать «не найдено» (и считать это успешным), т. е. ErrorList='3807'

3. Спасибо вам обоим за ваши ответы ! Действительно, Фред, это то, что я, наконец, решил сделать, я думал об этом в самом начале, но хотел более «правильного» решения. В итоге все получилось нормально. Знаете ли вы, может ли работать работа с двумя разными DDL (один для выбора и один для удаления)? Еще раз благодарю вас за потраченное время

4. Нет, даже если бы вы использовали другой оператор для ВЫБОРА, вы не смогли бы условно сгенерировать / выполнить УДАЛЕНИЕ в одном и том же задании TPT. У вас может быть несколько заданий TPT плюс несколько сценариев «оболочки» вокруг них или BTEQ для условного выполнения, за которым следует задание TPT.

Ответ №1:

Решение, которое Фред рекомендовал мне попробовать в комментариях, сработало просто отлично :

Я думаю, что это связано с использованием NULL, но SELECT недопустим для оператора DDL. Рекомендуемый способ сделать это-просто передать сообщение оператору и попросить его игнорировать «не найдено» (и считать это успешным), т. е. errorList=’3807′

 DESCRIPTION 'Delete ET tables'
(
        DEFINE OPERATOR DDL_OPERATOR
          DESCRIPTION 'Teradata Parallel Transporter DDL Operator'
          TYPE DDL
          ATTRIBUTES
          (
                varchar TdpId = @TERADATA_TDP,
                varchar UserName = @USERDB,
                varchar UserPassword = @PWD,
                VARCHAR ErrorList = '3807'
          );

        APPLY
        ('DROP TABLE @TABLENAME')
        TO OPERATOR(DDL_OPERATOR);
);```