2014-06-25 117 views
0

我想计算一些表的行数。但表名应该动态使用。我想在一个SQL语句中做到这一点。DB2动态表名

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 

,并没有发现其他的工作液...

是否有一个解决方案? 在此先感谢。

回答

0

我认为你应该SELECT COUNT(*) FROM tmp.tbl在多个报表折算像

select count(*) from TABLECD 
select count(*) from TABLE2CD 
... 

然而,您的查询会尽量做到表TBL的计数模式中的TMP。

您必须准备完整的SQL语句,将其存储在一个变量中并将其传递给PREPARE语句(documentation)。

一个相当完整的存储过程,有点适合您的要求可以找到here。计数结果将存储在表格COUNTERS中,您可以随后查询。

//编辑:这是从主题的例子,适应工作(没有测试过,因为我没有DB2实例测试ATM):

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; 
END 
+0

我总是得到这个错误:DB21034E该命令被处理作为SQL语句,因为它不是 有效的命令行处理器命令。在SQL处理过程中,它返回: SQL0104N在“ame LIKE'%CD' DO”之后找到了意外标记“PREPARE”。预期的标记可能包括:“SELECT”。 LINE NUMBER = 5。 SQLSTATE = 42601 – user3775041

+0

我添加了链接的论坛主题中的代码和所需的更正。我无法测试它。 不要忘记'PREPARE'语句必须在存储过程中运行。 –