执行 Teradata UDF 触发器数据类型与定义的类型名称不匹配
Execute Teradata UDF Triggers Data Type does not match a Defined Type name
我有以下 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
查询失败并显示以下错误消息:
Executed as Single statement. Failed [3706 : 42000] Syntax error: Data Type "TABLEKIND" does not match a Defined Type name.
Elapsed time = 00:00:00.283
STATEMENT 1: Select Statement failed.
我检查了 TableKind 的数据类型,它是 CHAR(1),所以它应该被接受 VARCHAR(2) 的 UDF 接受。知道问题的原因吗?
必须使用创建 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
我有以下 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
查询失败并显示以下错误消息:
Executed as Single statement. Failed [3706 : 42000] Syntax error: Data Type "TABLEKIND" does not match a Defined Type name. Elapsed time = 00:00:00.283 STATEMENT 1: Select Statement failed.
我检查了 TableKind 的数据类型,它是 CHAR(1),所以它应该被接受 VARCHAR(2) 的 UDF 接受。知道问题的原因吗?
必须使用创建 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