首页 > 解决方案 > db2 select statement from a table name 其中表名是一个变量

问题描述

我需要从db2数据库中选择所有表行数。

我有一个查询来选择所有架构和表名:

select rtrim(tabschema)||'.'||rtrim(tabname) as tableName from syscat.tables where tabschema = 'COM' order by tabname;

这个查询给了我数据库表名的列表。

我想做类似的事情:

select count(*) from tableFromTheFirstQuery

其中 tableFromThePreviousQuery 由我的第一个查询的 tableName 代替。

我不能这样做

select count(*) from (select rtrim(tabschema)||'.'||rtrim(tabname) as tableName from syscat.tables where tabschema = 'COM' order by tabname);

我只会得到我的第一个查询的计数结果。

我不确定这种方式是否存在。基本上,在进行 DR 活动之前,我需要将所有表格行数保存在一个文本文件中。

好心提醒

标签: countdb2

解决方案


您可以使用这样的复合语句

CREATE TABLE COUNT_ROWS (
    TABSCHEMA  VARCHAR(128) NOT NULL
,   TABNAME    VARCHAR(128) NOT NULL
,   ROW_COUNT   BIGINT
)
@
BEGIN
    FOR C AS cur CURSOR WITH HOLD FOR
        SELECT 'INSERT INTO COUNT_ROWS SELECT ''' || TABSCHEMA || ''',''' || TABNAME || ''', COUNT(*) FROM '
            || '"' ||  TABSCHEMA || '"."' || TABNAME || '"' AS S
        FROM SYSCAT.TABLES
        WHERE TYPE = 'T' AND TABSCHEMA NOT LIKE 'SYS%'
        WITH UR
    DO
          EXECUTE IMMEDIATE C.S;
          COMMIT;
    END FOR;
END
@
SELECT * FROM COUNT_ROWS
@

请注意,您需要将其@用作语句终止符才能使上述内容运行


推荐阅读