循环遍历表列表并检查字段中的值(DB2)

时间:2011-03-22 14:31:24

标签: db2

在DB2中,我可以使用以下sql语句获取表的列表:

select tabname from syscat.tables where `tabschema = 'DBO'

假设每个表都有一个名为a1的字段,我该怎么办? 循环遍历表并检查该字段中的值 在每个表中?

2 个答案:

答案 0 :(得分:2)

通常有两种方式。一种方法是编写一个程序来处理每个文件以检查该列。该程序可以使用嵌入式SQL从每个表中检索所选值的计数。或者,您可以创建一个存储过程,该过程接受表和模式名称作为输入,并将输出值设置为该表是否具有所选值的布尔指示符。

潜在地,您可以创建一个外部proc来遍历表列表。对于每个表,它将调用内部过程来测试值的存在。

这是我用来验证基本原理的测试过程。它会检查APFILE='ACCPTH'列。它返回(1)或(0),具体取决于是否有任何行具有该值。

--  Generate SQL 
--  Version:                    V6R1M0 080215 
--  Generated on:               03/22/14 02:59:07 
--  Relational Database:        TISI 
--  Standards Option:           DB2 for i 
DROP SPECIFIC PROCEDURE SQLEXAMPLE.CHKFLDVAL ; 

SET PATH "QSYS","QSYS2","SYSPROC","SYSIBMADM","mylib" ; 

CREATE PROCEDURE SQLEXAMPLE.CHKFLDVAL ( 
    IN TABLENAME VARCHAR(128) , 
    IN SCHEMANAME VARCHAR(128) , 
    OUT VALFOUND SMALLINT ) 
    LANGUAGE SQL 
    SPECIFIC SQLEXAMPLE.CHKFLDVAL 
    NOT DETERMINISTIC 
    READS SQL DATA 
    CALLED ON NULL INPUT 
    SET OPTION  ALWBLK = *ALLREAD , 
    ALWCPYDTA = *OPTIMIZE , 
    COMMIT = *NONE , 
    CLOSQLCSR = *ENDMOD , 
    DECRESULT = (31, 31, 00) , 
    DFTRDBCOL = *NONE , 
    DLYPRP = *NO , 
    DYNDFTCOL = *NO , 
    DYNUSRPRF = *USER , 
    RDBCNNMTH = *RUW , 
    SRTSEQ = *HEX   

    P1 : BEGIN

 DECLARE STMTSQL VARCHAR ( 256 ) ;
 DECLARE RTNRESULT SMALLINT ;

 SET STMTSQL = 'VALUES (select CASE WHEN count(*) = 0 THEN 0 ELSE 1 END as chkVal from ' CONCAT SCHEMANAME CONCAT '.' CONCAT TABLENAME CONCAT ' where APFILE=''ACCPTH'' group by APFILE) INTO ?' ;

 PREPARE STMT_NAME FROM STMTSQL ;
 EXECUTE STMT_NAME USING RTNRESULT ;

 SET VALFOUND = RTNRESULT ;

 END P1  ; 

COMMENT ON SPECIFIC PROCEDURE SQLEXAMPLE.CHKFLDVAL 
    IS 'Check field value in some table' ;

如果我用不同的TableName或SchemaName参数值调用它,我可以在rtnResult中返回不同的值。

SQL就是实际需要的。对SQL来说,这不是一件特别好的事情。

答案 1 :(得分:0)

您不能仅使用SQL语句执行此操作。您将不得不进行一些脚本编程或某种编程,以根据您找到的表名创建新查询并运行它们。