Db2

db2 select statement from a table name 其中表名是一個變數

  • November 7, 2019

我需要從 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 活動之前,我需要將所有表格行數保存在一個文本文件中。

好心提醒

您需要對錶格進行循環。從 Linux 中的 sh 中,您可以執行以下操作:

db2 connect to db
for t in $(db2 -x "select rtrim(tabschema)||'.'||rtrim(tabname) from syscat,tables where tabschema = 'COM' order by tabname"); do
   db2 "select '$t', count(1) from $t"
done

-x 刪除標題和其他資訊。

您可以使用這樣的複合語句

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
@

請注意,您需要將其@用作語句終止符才能使上述內容執行

引用自:https://dba.stackexchange.com/questions/252632