2014-02-05 5 views
3

Я хочу получить фактический тип столбца из системных таблиц Teradata, таких как dbc.columns.Получить тип столбца, используя системные таблицы teradata

Эта таблица имеет столбец столбца, но не дает фактического типа данных.

я могу получить выход с

select type(columnname) from table 
output: varchar2(20) 

но есть 1000 столов и 50000 столбцов. Пожалуйста, предложите некоторый запрос, который может дать мне фактический столбец столбца из самих метаданных

+0

Не могли бы вы уточнить, что вы подразумеваете под «фактическим типом столбца»? Просто перевод двух символов в dbc.ColumnsV.ColumnType в строку, например. CV -> VARCHAR? Или VARCHAR (20), DECIMAL (10,2) и т. Д.? – dnoeth

ответ

4

Для представлений тип столбца будет NULL, поскольку он разрешен во время выполнения.

Для одной таблицы вы можете сделать HELP COLUMN viewname. *;, чтобы получить фактические типы данных.

Btw, нет такого типа, как VARCHAR2 в Teradata, это Oracle :-)

Edit: Похоже, вы хотите полное определение столбца. Это SQL UDF возвращая ту же информацию вы найдете в таблице SHOW (я не уверен, если TD14.10 покрыт тоже, я не проверял, пока):

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 
; 
+0

yes varcha2 (20) может не быть, но я могу видеть вывод типа select (CNCT_INFO_PSNLCELLPH_FRMT_NUM) из WIS_V.WIS_WORKER_COMP_DAY_V как VARCHAR (50), кроме того, для 1000 таблиц я не могу пойти и запустить HELP COLUMN viewname. *; – user1011046

+0

Нет другого способа, кроме отдельных операторов для каждого вида. Зачем вам это нужно для всех этих взглядов? – dnoeth

+0

было уникальное требование, когда мне нужно сопоставить базу данных oracle с базой данных teradata, имеют ли все таблицы одинаковое количество столбцов и столбцов одинаковой ширины, чем в oracle. – user1011046

2

Я нашел это заявление

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 
0

Идя Retrieving column and other metadata information in Teradata Я хотел бы предложить, чтобы извлечь имена таблиц и столбцов из таблиц DBC, а затем построить «простой сценарий» для извлечения всей информации. Я понятия не имею о TD, но из Quick Reference не должно быть слишком сложно создать цикл, который динамически извлекает результаты и вставляет его в вашу собственную таблицу.

Наконец-то хороший пример для предложения курсора =)

Смежные вопросы