Db2
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 活動之前,我需要將所有表格行數保存在一個文本文件中。
好心提醒
您需要對錶格進行循環。從 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 @
請注意,您需要將其
@
用作語句終止符才能使上述內容執行