我想要计算一些表的行数。但是应该动态使用表名。我想在一条SQL语句中做到这一点。
我试过了
BEGIN ATOMIC
FOR tmp AS (
SELECT tabschema || '.' || tabname tbl
FROM syscat.tables WHERE tabname LIKE '%CD') DO
(SELECT COUNT(*) FROM tmp.tbl);
END FOR;
END但是我收到了错误
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0204N "TMP.TBL" is an undefined name. LINE NUMBER=1. SQLSTATE=42704却找不到其他可行的解决方案。
有什么解决方案吗?提前谢谢。
发布于 2014-06-25 22:43:01
我假设您的SELECT COUNT(*) FROM tmp.tbl应该转换成多个语句,比如
select count(*) from TABLECD
select count(*) from TABLE2CD
...但是,您的查询将尝试对模式TMP中的表TBL进行计数。
您必须准备完整的SQL语句,将其存储在一个变量中并将其传递给prepare语句(documentation )。
可以在here中找到一个比较完整的存储过程,它在某种程度上符合您的需求。计数的结果将存储在表COUNTERS中,您可以在以后查询该表。
//edit:这是主题“适应工作”中的示例(没有测试,因为我没有DB2实例可以测试自动柜员机):
CREATE PROCEDURE tableCount()
LANGUAGE SQL
BEGIN
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE SQLSTATE CHAR(5);
DECLARE vTableName VARCHAR(20);
DECLARE vTableCount INTEGER;
DECLARE stmt varchar(2000);
DECLARE not_found CONDITION FOR SQLSTATE '02000';
DECLARE c1 CURSOR FOR
SELECT tabname from syscat.tables where tabschema='DB2ADMIN';
DECLARE C2 CURSOR FOR S2
DECLARE CONTINUE HANDLER FOR not_found
SET stmt = '';
Delete from COUNTERS;
OPEN c1;
getRows:
LOOP
FETCH c1 INTO vTableName;
IF SQLCODE = 0 THEN
SET stmt ='SELECT Count(*) FROM ' || vTableName;
PREPARE S2 FROM stmt;
OPEN C2;
SET vTableCount = 0;
FETCH C2 INTO vTableCount;
INSERT INTO COUNTERS (tableName, tableCount)
VALUES (vTableName, vTableCount);
CLOSE C2;
ELSE
LEAVE getRows;
END IF;
END LOOP getRows;
CLOSE c1;
ENDhttps://stackoverflow.com/questions/24408018
复制相似问题