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
能否请您帮助我,让我知道这里出了什么问题,我该如何解决?谢谢!
答案 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.COLUMNS和SYSCAT.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。