使用 SQL 获取库中所有文件的行数

Get count of rows for all files in library with SQL

想到这个任务有两个选项:

选项 1:直接方法

  1. 执行select table_name from qsys2.systables where table_schema = 'LIBRARY'
  2. 对输出的每个条目执行select count(*) from LIBRARY.TABLENAME
  3. 保存结果并重复步骤 2。

选项 2:动态 sql 语句

  1. 尝试将 script 结果包装到 begin 和后续的 execute immediate sql; end; 语句中。

不幸的是,此代码中的 with 子句不能与 begin 一起使用,我不知道如何在没有它的情况下正确重写整个脚本。

有人可以提出比选项 1 中所述性能更好的解决方案吗?

所需的输出格式:

╔════════════╦═══════╗
║ TABLE_NAME ║ COUNT ║
╠════════════╬═══════╣
║ a1         ║   432 ║
║ a2         ║     9 ║
║ a3         ║     0 ║
╚════════════╩═══════╝

UPD

根据回答,我找到了这个程序脚本,但是它不起作用:

CREATE PROCEDURE LIB/CNT                                          
  LANGUAGE SQL                                                    
BEGIN                                                             
    CREATE TYPE CHARARRAY AS VARCHAR(10) ARRAY[500];              
    DECLARE NAMES CHARARRAY;                                      
    DECLARE i INTEGER;                                            
    SET i = 1;                                                    
    SET names = ARRAY[SELECT table_name FROM qsys2.systables WHERE
table_schema = 'LIBRARY'];                                        
    SET numNames = CARDINALITY(names);                            
    WHILE i <= numNames                                           
        SET stmt = 'SELECT ' || names[i] || ' AS TABLE_NAME,      
COUNT(*) FROM ' || names[i];                                      
        PREPARE s1 FROM stmt;                                     
        EXECUTE s1;                                               
    END WHILE;                                                    
END;

CREATE TYPE reference.

错误信息:Token NAMES was not valid. Valid tokens: GLOBAL.

在名称前添加 global 得到 Token NAMES was not valid. Valid tokens: TEMPORARY.

您可以尝试使用以下脚本:

BEGIN
    CREATE TYPE namesArray AS VARCHAR(100) ARRAY[100];
    DECLARE names namesArray;
    DECLARE i INTEGER;
    SET i = 1;
    SET names = ARRAY[SELECT table_name FROM qsys2.systables WHERE table_schema = 'LIBRARY'];
    SET numNames = CARDINALITY(names);
    WHILE i <= numNames
        SET stmt = 'SELECT ' || names[i] || ' AS TABLE_NAME, COUNT(*) FROM ' || names[i];
        PREPARE s1 FROM stmt;
        EXECUTE s1;
    END WHILE;
END

此处的策略是使用第一个查询中的 table 名称填充 names 数组。然后,遍历该数组并对每个 table.

动态执行计数查询

理解题目指定"WITH SQL",还是要建议,如果你不介意执行原生AS/400命令...

DSPFD 文件(库/*全部)类型(*MBRLIST)输出(*输出文件)文件(*PF)输出文件(LIBRARY/TABLLIST)

...将创建或替换 table "TABLLIST" 包含字段 "MLNRCD" = LIBRARY 中每个 table/member 的当前记录数(行),这可以更多容易处理 "with SQL":

"SELECT MLFILE, MLNRCD FROM LIBRARY/TABLLIST" 应该会产生 table 和行。

你什么都不用做,系统已经收集了信息...

SELECT SYSTEM_TABLE_SCHEMA, SYSTEM_TABLE_NAME
      , NUMBER_ROWS, TABLE_SCHEMA, TABLE_NAME 
FROM systablestat 
WHERE SYSTEM_TABLE_SCHEMA = 'MYLIB';

为了将来参考,标准目录已经存在了一段时间。
DB2 for i catalog views

此外,DB2 for i 团队继续添加 "services" 以通过 SQL
提供信息 DB2 for i - Services