使用 SQL 获取库中所有文件的行数
Get count of rows for all files in library with SQL
想到这个任务有两个选项:
选项 1:直接方法
- 执行
select table_name from qsys2.systables where table_schema = 'LIBRARY'
- 对输出的每个条目执行
select count(*) from LIBRARY.TABLENAME
- 保存结果并重复步骤 2。
选项 2:动态 sql 语句
- 尝试将 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;
错误信息: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
想到这个任务有两个选项:
选项 1:直接方法
- 执行
select table_name from qsys2.systables where table_schema = 'LIBRARY'
- 对输出的每个条目执行
select count(*) from LIBRARY.TABLENAME
- 保存结果并重复步骤 2。
选项 2:动态 sql 语句
- 尝试将 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;
错误信息: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