Get column type using teradata system tables
我想从dbc.columns之类的teradata系统表中获取实际的列类型。
该表具有列columntype,但未提供实际的数据类型。
我可以得到输出
1 2 | SELECT TYPE(columnname) FROM TABLE output: varchar2(20) |
但是有1000个表和50000列。 请提出一些查询,可以从元数据本身为我提供列的实际列类型
对于视图,列类型将为NULL,因为它是在运行时解析的。
对于单个表,您可以执行HELP COLUMN视图名。 以获得实际的数据类型。
顺便说一句,在Teradata中没有像Varchar2这样的类型,那就是Oracle :-)
编辑:
好像您想要一列的完整定义。 这是一个SQL UDF,返回与您在SHOW TABLE中找到的信息相同的信息(我也不确定是否涵盖TD14.10,但我也没有检查):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | REPLACE FUNCTION DataTypeString ( ColumnType CHAR(2), ColumnLength INT, DecimalTotalDigits SMALLINT, DecimalFractionalDigits SMALLINT, CharType SMALLINT, ColumnUDTName VARCHAR(128) CHARACTER SET UNICODE ) RETURNS VARCHAR(60) LANGUAGE SQL CONTAINS SQL DETERMINISTIC SQL SECURITY DEFINER COLLATION INVOKER INLINE TYPE 1 RETURN CASE ColumnType WHEN 'BF' THEN 'BYTE(' || TRIM(CAST(ColumnLength AS INTEGER)) || ')' WHEN 'BV' THEN 'VARBYTE(' || TRIM(CAST(ColumnLength AS INTEGER)) || ')' WHEN 'CF' THEN 'CHAR(' || TRIM(CAST(ColumnLength AS INTEGER)) || ')' WHEN 'CV' THEN 'VARCHAR(' || TRIM(CAST(ColumnLength AS INTEGER)) || ')' WHEN 'D ' THEN 'DECIMAL(' || TRIM(DecimalTotalDigits) || ',' || TRIM(DecimalFractionalDigits) || ')' WHEN 'DA' THEN 'DATE' WHEN 'F ' THEN 'FLOAT' WHEN 'I1' THEN 'BYTEINT' WHEN 'I2' THEN 'SMALLINT' WHEN 'I8' THEN 'BIGINT' WHEN 'I ' THEN 'INTEGER' WHEN 'AT' THEN 'TIME(' || TRIM(DecimalFractionalDigits) || ')' WHEN 'TS' THEN 'TIMESTAMP(' || TRIM(DecimalFractionalDigits) || ')' WHEN 'TZ' THEN 'TIME(' || TRIM(DecimalFractionalDigits) || ')' || ' WITH TIME ZONE' WHEN 'SZ' THEN 'TIMESTAMP(' || TRIM(DecimalFractionalDigits) || ')' || ' WITH TIME ZONE' WHEN 'YR' THEN 'INTERVAL YEAR(' || TRIM(DecimalTotalDigits) || ')' WHEN 'YM' THEN 'INTERVAL YEAR(' || TRIM(DecimalTotalDigits) || ')' || ' TO MONTH' WHEN 'MO' THEN 'INTERVAL MONTH(' || TRIM(DecimalTotalDigits) || ')' WHEN 'DY' THEN 'INTERVAL DAY(' || TRIM(DecimalTotalDigits) || ')' WHEN 'DH' THEN 'INTERVAL DAY(' || TRIM(DecimalTotalDigits) || ')' || ' TO HOUR' WHEN 'DM' THEN 'INTERVAL DAY(' || TRIM(DecimalTotalDigits) || ')' || ' TO MINUTE' WHEN 'DS' THEN 'INTERVAL DAY(' || TRIM(DecimalTotalDigits) || ')' || ' TO SECOND(' || TRIM(DecimalFractionalDigits) || ')' WHEN 'HR' THEN 'INTERVAL HOUR(' || TRIM(DecimalTotalDigits) || ')' WHEN 'HM' THEN 'INTERVAL HOUR(' || TRIM(DecimalTotalDigits) || ')' || ' TO MINUTE' WHEN 'HS' THEN 'INTERVAL HOUR(' || TRIM(DecimalTotalDigits) || ')' || ' TO SECOND(' || TRIM(DecimalFractionalDigits) || ')' WHEN 'MI' THEN 'INTERVAL MINUTE(' || TRIM(DecimalTotalDigits) || ')' WHEN 'MS' THEN 'INTERVAL MINUTE(' || TRIM(DecimalTotalDigits) || ')' || ' TO SECOND(' || TRIM(DecimalFractionalDigits) || ')' WHEN 'SC' THEN 'INTERVAL SECOND(' || TRIM(DecimalTotalDigits) || ',' || TRIM(DecimalFractionalDigits) || ')' WHEN 'BO' THEN 'BLOB(' || TRIM(CAST(ColumnLength AS INTEGER)) || ')' WHEN 'CO' THEN 'CLOB(' || TRIM(CAST(ColumnLength AS INTEGER)) || ')' WHEN 'PD' THEN 'PERIOD(DATE)' WHEN 'PM' THEN 'PERIOD(TIMESTAMP('|| TRIM(DecimalFractionalDigits) || ')' || ' WITH TIME ZONE' WHEN 'PS' THEN 'PERIOD(TIMESTAMP('|| TRIM(DecimalFractionalDigits) || '))' WHEN 'PT' THEN 'PERIOD(TIME(' || TRIM(DecimalFractionalDigits) || '))' WHEN 'PZ' THEN 'PERIOD(TIME(' || TRIM(DecimalFractionalDigits) || '))' || ' WITH TIME ZONE' WHEN 'UT' THEN COALESCE(ColumnUDTName, '<Unknown> ' || ColumnType) WHEN '++' THEN 'TD_ANYTYPE' WHEN 'N' THEN 'NUMBER(' || CASE WHEN DecimalTotalDigits = -128 THEN '*' ELSE TRIM(DecimalTotalDigits) END || CASE WHEN DecimalFractionalDigits IN (0, -128) THEN '' ELSE ',' || TRIM(DecimalFractionalDigits) END || ')' WHEN 'A1' THEN COALESCE('SYSUDTLIB.' || ColumnUDTName, '<Unknown> ' || ColumnType) WHEN 'AN' THEN COALESCE('SYSUDTLIB.' || ColumnUDTName, '<Unknown> ' || ColumnType) ELSE '<Unknown> ' || ColumnType END || CASE WHEN ColumnType IN ('CV', 'CF', 'CO') THEN CASE CharType WHEN 1 THEN ' CHARACTER SET LATIN' WHEN 2 THEN ' CHARACTER SET UNICODE' WHEN 3 THEN ' CHARACTER SET KANJISJIS' WHEN 4 THEN ' CHARACTER SET GRAPHIC' WHEN 5 THEN ' CHARACTER SET KANJI1' ELSE '' END ELSE '' END ; |
我发现这句话
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | SELECT DATABASENAME, TABLENAME, COLUMNNAME, TRIM(COLUMNTYPE)||'('||TRIM(COLUMNNUM)||')' FROM ( SELECT DATABASENAME, TABLENAME, COLUMNNAME, CASE WHEN COLUMNTYPE='CF' THEN 'CHAR' WHEN COLUMNTYPE='CV' THEN 'VARCHAR' WHEN COLUMNTYPE='D' THEN 'DECIMAL' WHEN COLUMNTYPE='TS' THEN 'TIMESTAMP' WHEN COLUMNTYPE='I' THEN 'INTEGER' WHEN COLUMNTYPE='I2' THEN 'SMALLINT' WHEN COLUMNTYPE='DA' THEN 'DATE' END AS COLUMNTYPE, CASE WHEN COLUMNTYPE='CF' THEN COLUMNLENGTH WHEN COLUMNTYPE='CV' THEN COLUMNLENGTH WHEN COLUMNTYPE='D' THEN (DECIMALTOTALDIGITS||','||DECIMALFRACTIONALDIGITS) WHEN COLUMNTYPE='TS' THEN COLUMNLENGTH WHEN COLUMNTYPE='I' THEN DECIMALTOTALDIGITS WHEN COLUMNTYPE='I2' THEN DECIMALTOTALDIGITS WHEN COLUMNTYPE='DA' THEN NULL END AS COLUMNNUM FROM DBC.COLUMNS WHERE DATABASENAME='your database' ) TBL |
通过检索Teradata中的列和其他元数据信息,我建议从DBC表中提取表和列的名称,然后构建一个"简单脚本"来获取所有信息。 我对TD毫无头绪,但是从快速参考开始,创建一个动态获取结果并将其插入到您自己的表中的循环应该不是很困难。
最后是提出游标的好例子=)