如何在db2数据库中打印每个列/表的详细信息(表名,列名,数据类型)?

时间:2019-11-12 06:34:32

标签: sql db2

In my previous question Mark建议在显示数据库中每个表的计数时给出一个很好的答案。我想扩展此过程,并显示有关数据库中每一列的特定信息(TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,DATA_TYPE),而不是计数。

到目前为止,我有以下命令:

userId

但是现在当我运行它时:

--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION EXPORT_SCHEMAS()
RETURNS TABLE (P_TABSCHEMA VARCHAR(128), P_TABNAME VARCHAR(128), P_COLUM_NNAME VARCHAR(128), P_DATA_TYPE VARCHAR(128))
BEGIN
  DECLARE L_STMT VARCHAR(256);
  DECLARE L_ROWS VARCHAR(256);

  FOR V1 AS
    SELECT TABSCHEMA, TABNAME
    FROM SYSCAT.TABLES
    WHERE TYPE = 'T'
    ORDER BY 1,2
  DO
    SET L_STMT = 'SET ? = (SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM SYSIBM.COLUMNS where TABLE_NAME = "'||V1.TABNAME||'" AND TABLE_SCHEMA = "'||V1.TABSCHEMA||'")';
    PREPARE S FROM L_STMT;
    EXECUTE S INTO L_ROWS;
    PIPE(L_ROWS);
  END FOR;
  RETURN;
END@

SELECT * FROM TABLE(EXPORT_SCHEMAS())@

我遇到了错误:

db2 -ntd~ -f export_schemas.sql > dump.csv

能否请您帮助我,让我知道这里出了什么问题,我该如何解决?谢谢!

2 个答案:

答案 0 :(得分:2)

如果将Db2用于LUW,则不应在系统目录的查询中使用SYSIBM模式。请改用SYSCAT

您无需使用任何功能即可在此处获得所需的内容。请改用以下查询:

SELECT TABSCHEMA, TABNAME, COLNAME, TYPENAME
FROM SYSCAT.COLUMNS
ORDER BY TABSCHEMA, TABNAME, COLNO;

至于你的日常活动。文本中存在许多错误。

1)如果要使用SET语句分配多个值,则必须在该语句中使用相应数量的参数标记:

SET (?, ..., ?) = (SELECT COL1, ..., COLn FROM ...);
PREPARE S FROM L_STMT;
EXECUTE S INTO L_V1, ..., L_Vn;

2)RETURNS TABLE (...)PIPE(...)的列数必须相同

答案 1 :(得分:0)

您可以直接查询表SYSCAT.COLUMNSSYSCAT.TABLES。以下内容返回表架构和名称,后跟列名称及其类型。列信息按列顺序排序:

select t.tabschema, t.tabname, c.colname, c.typename, c.colno
from syscat.columns c, syscat.tables t
where t.type='T' and t.tabname=c.tabname and t.tabschema=c.tabschema
order by 1,2,c.colno

顺便说一句:Db2具有用于导出架构信息的工具db2look