执行 Teradata UDF 触发器数据类型与定义的类型名称不匹配

Posted

技术标签:

【中文标题】执行 Teradata UDF 触发器数据类型与定义的类型名称不匹配【英文标题】:Execute Teradata UDF Triggers Data Type does not match a Defined Type name 【发布时间】:2018-05-31 14:47:01 【问题描述】:

我有以下 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),所以它应该被接受 VARCHAR(2) 的 UDF 接受。知道问题的原因吗?

【问题讨论】:

尝试限定 UDF:MIGRATION_TOOL.GET_OBJECT_TYPE(B.TABLEKIND) AS OBJECT_TYPE。顺便说一句,SPECIFIC 中的数据库名称与 REPLACE 中的数据库不匹配 感谢@dnoeth,数据库名称在我的问题中是一个错字,但在数据库中是正确的...我尝试限定 UDF 并收到以下错误:作为单个语句执行。失败 [5628 : HY000] 在 MIGRATION_TOOL.A、DBC.B 或 DBC.C 中找不到列 MIGRATION_TOOL。 您的原始选择是有效的语法,当存在未知的 UDF 名称时,您会得到此 与定义的类型名称不匹配。第二个错误表示数据库MIGRATION_TOOL不存在,检查是否有错别字。 谢谢@dnoeth 我的代码中确实有错字,使用数据库名称调用 UDF 解决了“数据类型不匹配”问题...您想用这个创建答案吗?我会接受的。 【参考方案1】:

必须使用创建 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 触发器数据类型与定义的类型名称不匹配的主要内容,如果未能解决你的问题,请参考以下文章

UDF 不给出相同的结果

mysql 浮点数与定点数

Mysql数据库触发器调用脚本

Teradata中“日期”数据类型列的最近30天

JDBC的ResultSet游标转spark的DataFrame,数据类型的映射以TeraData数据库为例

Pyspark:UDF 将正则表达式应用于数据帧中的每一行