Просмотрите список таблиц и проверьте значение в поле (DB2) - PullRequest
0 голосов
/ 22 марта 2011

В DB2 я могу получить список таблиц с помощью следующего оператора sql:

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

Предполагая, что в каждой таблице есть поле с именем a1, как я могу цикл по таблицам и проверить значение в этом поле в каждый стол?

Ответы [ 2 ]

2 голосов
/ 22 марта 2014

Есть два основных способа. Можно было бы написать программу, которая обрабатывает каждый файл для проверки этого столбца. Программа может использовать встроенный SQL для извлечения счетчика выбранного значения из каждой таблицы. Или вы можете создать хранимый процесс, который принимает имя таблицы и схемы в качестве входных данных и устанавливает выходное значение в качестве логического индикатора того, имеет ли эта таблица выбранное значение.

Потенциально, вы можете создать внешний процесс для циклического просмотра списка таблиц. И для каждой таблицы она будет вызывать внутренний процесс, который проверяет наличие значения.

Это тестовый процесс, который я использовал для проверки основного принципа. Проверяет столбец на 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.

0 голосов
/ 23 марта 2011

Вы не можете сделать это, используя только операторы SQL.Вам нужно будет немного по сценарию или программированию, чтобы создавать новые запросы на основе найденных вами имен таблиц и запускать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...