更新时间:2024-11-15 GMT+08:00

DBC.COLUMNS

DBC.COLUMNS视图是一个表,包含有关表和视图列、存储过程、或宏参数的信息。其中包括以下列:DatabaseName、TableName、ColumnName、ColumnFormat、ColumnTitle、ColumnType、DefaultValue。在GaussDB(DWS)中,这个表等效于information_schema.columns表。

本特性要求一次性执行以下自定义脚本文件:DSC/scripts/teradata/db_scripts/mig_fn_get_datatype_short_name.sql

有关文件执行的详细步骤,请参见运行环境前提条件

迁移工具将以下dbc.columns列迁移为对应的information_schema列:

表1 dbc.columns列迁移到information_schema列

dbc.columns

information_schema.columns

ColumnName

Column_Name

ColumnType

mig_fn_get_datatype_short_name (data_Type)

ColumnLength

character_maximum_length

DecimalTotalDigits

numeric_precision

DecimalFractionalDigits

numeric_scale

databasename

table_schema

tablename

table_name

ColumnId

ordinal_position

迁移dbc.columns时,假设以下条件成立:

  • FROM子句仅包含dbc.columns的TABLE NAME。
  • COLUMN NAME为以下任一格式:column_name或schema_name.table_name.column_name。

以下场景不支持dbc.columns迁移:

  • FROM子句包含dbc.columns表名的别名(dbc.columns别名)。
  • dbc.columns与其他表组合(FROM dbc.columns alias1,table1 alias2 OR dbc.columns alias1 join table1 alias2)。
  • 如果输入的SELECT语句直接包含dbc.columns的列名,则该工具会将输入的列名称迁移为别名。例如,输入列名称DecimalFractionalDigits会迁移为numeric_scale,其别名为DecimalFractionalDigits。

    示例:

    输入:
    1
    2
    3
    4
    5
    6
    SEL
           columnid
           ,DecimalFractionalDigits
         FROM
           dbc.columns
    ;
    

    输出:

    1
    2
    3
    4
    5
    6
    SELECT
           ordinal_position columnid
           ,numeric_scale DecimalFractionalDigits
         FROM
           information_schema.columns
    ;
    
  • 关于表名和模式名称,迁移工具会将所有字符串值转换为小写。如果要区分大小写,使用双引号表示表/模式名称。在以下输入示例中,“Test”不会转换为小写。
    1
    2
    3
    4
    5
    6
    SELECT
              TableName
         FROM
              dbc . columns
         WHERE
              dbc.columns.databasename = '"Test"';
    

输入:dbc.columns table,指定所有支持列

 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
'$AUTO_DB_IP'
,objectdatabasename
,objecttablename
,'$TX_DATE_10'
,''
,'0' 
,FirstStepTime
,FirstRespTime
,RowCount
,cast(RowCount*sum(case when T2.ColumnType ='CV' then T2.ColumnLength/3 else  T2.ColumnLength end) as decimal(38,0))
,'3' 
,''
,'BAK_CLR_DATA'
,'2'
,''
FROM TMP_clr_information T1
inner join dbc.columns T2
on T1.objectdatabasename =T2.DatabaseName
and T1.objecttablename =T2.TableName
where  T2.DatabaseName not in (
sel child from dbc.children 
where parent='$FCRM_DB'
)
group by 1,2,3,4,5,6,7,8,9,11,12,13,14,15;

输出

 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
SELECT
          '$AUTO_DB_IP'
          ,objectdatabasename
          ,objecttablename
          ,'$TX_DATE_10'
          ,''
          ,'0'                                
          ,FirstStepTime
          ,FirstRespTime
          ,RowCount
          ,CAST( RowCount * SUM ( CASE WHEN mig_fn_get_datatype_short_name ( T2.data_Type ) = 'CV' THEN T2.character_maximum_length / 3 ELSE T2.character_maximum_length END ) AS DECIMAL( 38 ,0 ) )                        
          ,'3'                                
          ,''
          ,'BAK_CLR_DATA'
          ,'2'
          ,''
     FROM
          TMP_clr_information T1 INNER JOIN information_schema.columns T2
               ON T1.objectdatabasename = T2.table_schema
          AND T1.objecttablename = T2.table_name
     WHERE
          NOT EXISTS (
               SELECT
                         child
                    FROM
                         dbc.children
                    WHERE
                         child = T2.table_schema
                         AND( parent = '$FCRM_DB' )
          )
     GROUP BY
          1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,11 ,12 ,13 ,14 ,15
;

输入:dbc.columns table,指定表名

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
SELECT
          TRIM( ColumnName )
          ,UPPER( dbc.columns.ColumnType )
     FROM
          dbc . columns
     WHERE
          dbc.columns.databasename = '"Test"'
     ORDER BY
          dbc.columns.ColumnId
;

输出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
SELECT
          TRIM( Column_Name )
          ,UPPER( mig_fn_get_datatype_short_name ( information_schema.columns.data_Type ) )
     FROM
          information_schema.columns
     WHERE
          information_schema.columns.table_schema = CASE
               WHEN TRIM( '"Test"' ) LIKE '"%'
               THEN REPLACE( SUBSTR( '"Test"' ,2 ,LENGTH( '"Test"' ) - 2 ) ,'""' ,'"' )
               ELSE LOWER( '"Test"' )
          END
     ORDER BY
          information_schema.columns.ordinal_position
;