Тип данных триггеров UDF «Выполнение Teradata» не соответствует имени определенного типа - PullRequest
0 голосов
/ 31 мая 2018

У меня есть следующий Teradata UDF:

REPLACE FUNCTION MIGRATION_TOOL.GET_OBJECT_TYPE(OBJECT_KIND VARCHAR(2))
RETURNS CHARACTER(20)
CONTAINS SQL
SPECIFIC MIGRATION_TOOL.GET_OBJECT_TYPE
COLLATION INVOKER
INLINE TYPE 1
RETURN CASE OBJECT_KIND
    WHEN 'O' THEN 'Table' --1
    WHEN 'T' THEN 'Table' --1
    WHEN 'V' THEN 'View'  --2
    WHEN 'M' THEN 'Macro' --3
    WHEN 'G' THEN 'Trigger'  --4
    WHEN 'P' THEN 'Stored Procedure'  --5
    WHEN 'I' THEN 'Join Index'  --6
    WHEN 'F' THEN 'Function'  --7
    WHEN 'FK' THEN 'Foreign Key' --0
    ELSE 'ND'
END;

И у меня есть следующий запрос с использованием UDF:

SELECT A.DATABASE_ID,
B.TABLENAME AS OBJECT_NAME,
GET_OBJECT_TYPE(B.TABLEKIND) AS OBJECT_TYPE,
MAX(CASE WHEN IDCOLTYPE IS NULL THEN 0 ELSE 1 END) AS FLAG_IDENTITY_COLUMN
FROM MIGRATION_TOOL.VW_TERADATA_DATABASE A
INNER JOIN DBC.TABLESV B ON A.DATABASE_NAME = B.DATABASENAME
LEFT JOIN DBC.COLUMNSV C ON B.DATABASENAME = C.DATABASENAME AND B.TABLENAME = C.TABLENAME
WHERE B.TABLENAME NOT LIKE ALL ('BKP%')
GROUP BY 1, 2, 3

Запрос не выполняется со следующим сообщением об ошибке:

Выполняется как отдельный оператор.Ошибка [3706: 42000] Синтаксическая ошибка: Тип данных "TABLEKIND" не соответствует имени определенного типа.Истекшее время = 00: 00: 00.283 ЗАЯВЛЕНИЕ 1: Выбор оператора не выполнен.

Я проверил тип данных TableKind, и это CHAR (1), поэтому он должен быть принят UDF, который принимает VARCHAR (2).Есть идеи о причине проблемы?

1 Ответ

0 голосов
/ 20 июня 2018

Пользовательские функции должны вызываться с именем базы данных, в которой создается UDF.Это сработало:

SELECT A.DATABASE_ID,
B.TABLENAME AS OBJECT_NAME,
MIGRATION_TOOL.GET_OBJECT_TYPE(B.TABLEKIND) AS OBJECT_TYPE,
MAX(CASE WHEN IDCOLTYPE IS NULL THEN 0 ELSE 1 END) AS FLAG_IDENTITY_COLUMN
FROM MIGRATION_TOOL.VW_TERADATA_DATABASE A
INNER JOIN DBC.TABLESV B ON A.DATABASE_NAME = B.DATABASENAME
LEFT JOIN DBC.COLUMNSV C ON B.DATABASENAME = C.DATABASENAME AND B.TABLENAME = C.TABLENAME
WHERE B.TABLENAME NOT LIKE ALL ('BKP%')
GROUP BY 1, 2, 3
...