在DB2中,我可以使用以下sql语句获取表的列表:
select tabname from syscat.tables where `tabschema = 'DBO'
假设每个表都有一个名为a1
的字段,我该怎么办?
循环遍历表并检查该字段中的值
在每个表中?
答案 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语句执行此操作。您将不得不进行一些脚本编程或某种编程,以根据您找到的表名创建新查询并运行它们。