代码之家  ›  专栏  ›  技术社区  ›  Alexis.Rolland user2915097

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

  •  0
  • Alexis.Rolland user2915097  · 技术社区  · 8 年前

    我有以下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接受。你知道问题的起因吗?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Alexis.Rolland user2915097    7 年前

    必须使用创建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