Мне нужно выбрать все количество строк таблицы из базы данных db2.

У меня есть запрос на выбор всей схемы и имени таблицы:

select rtrim(tabschema)||'.'||rtrim(tabname) as tableName from syscat.tables where tabschema = 'COM' order by tabname;

Этот запрос дает мне список имен таблиц базы данных.

Я бы хотел сделать что-то вроде:

select count(*) from tableFromTheFirstQuery

Где tableFromThePreviousQuery заменяется tableName моего первого запроса.

Я не могу сделать как

select count(*) from (select rtrim(tabschema)||'.'||rtrim(tabname) as tableName from syscat.tables where tabschema = 'COM' order by tabname);

Я получу только результат подсчета моего первого запроса.

Я не уверен, что способ существует или нет. В основном мне нужно сохранить все подсчеты строк таблицы в текстовом файле, прежде чем выполнять действия DR.

Добрый совет

0
Panadol Chong 6 Ноя 2019 в 11:30
Вы можете поместить это в хранимую процедуру. Есть ответы SO, которые показывают, как выполнить динамический оператор в SP. Не блокируйте всю базу данных и используйте UR для изоляции.
 – 
data_henrik
6 Ноя 2019 в 12:01

1 ответ

Вы можете использовать составной оператор, подобный этому

CREATE TABLE COUNT_ROWS (
    TABSCHEMA  VARCHAR(128) NOT NULL
,   TABNAME    VARCHAR(128) NOT NULL
,   ROW_COUNT   BIGINT
)
@
BEGIN
    FOR C AS cur CURSOR WITH HOLD FOR
        SELECT 'INSERT INTO COUNT_ROWS SELECT ''' || TABSCHEMA || ''',''' || TABNAME || ''', COUNT(*) FROM '
            || '"' ||  TABSCHEMA || '"."' || TABNAME || '"' AS S
        FROM SYSCAT.TABLES
        WHERE TYPE = 'T' AND TABSCHEMA NOT LIKE 'SYS%'
        WITH UR
    DO
          EXECUTE IMMEDIATE C.S;
          COMMIT;
    END FOR;
END
@
SELECT * FROM COUNT_ROWS
@

Обратите внимание, что вам нужно будет использовать @ в качестве терминатора вашего оператора, чтобы запустить вышеприведенное.

0
Paul Vernon 8 Ноя 2019 в 02:06