Обратитесь к имени таблицы динамически в DB2 / 400 SQL запросов ..?

голоса
0

Я хотел бы выполнить запрос, который получает комбинацию оперативных данных и метаданных для регулярно меняющегося списка имен таблиц. Это для исследования и анализа на большом сервере с 100+ схем и тысячами таблиц / представлений в каждом. Мне нужна помощь, ссылаясь на имена таблиц динамически, что я понимаю, не представляется возможным. Тем не мение...

Мой прибегая к помощи показывает, что решение может быть оператор SQL в строковой переменной, которая затем выполняется в инструкции EXEC. Но это DB2 / 400 v7r3, что сложная вещь (как его SQL ссылка на веб-сайте IBM), и у меня возникают трудности при создании правильного синтаксиса.

Вот простой пример того, что я хочу сделать, но, конечно, это не работает:

SELECT        TABLE_NAME,
              TABLE_TEXT,
              ( SELECT COUNT(*) FROM TABLE_NAME ) AS ROW_COUNT
              -- above line of course does not work
FROM          QSYS2.SYSTABLES
WHERE         TABLE_SCHEMA = 'ABCDEFGH'
AND           TABLE_NAME IN ('ARCMNTST', 'ARIMSGT', 'ARTENT', 'DAILYHT', 'ETC')

Я понимаю, что нужно что-то вроде следующего, но я не могу понять, правильные утверждения:

DECLARE       @sqltext AS VARCHAR(128)
SELECT        TABLE_NAME,
              TABLE_TEXT,
              ( SET @sqltext = 'SELECT COUNT(*) FROM ABCDEFGH.' || TABLE_NAME
                EXEC sqltest ) AS ROW_COUNT --this is probably wrong
FROM          QSYS2.SYSTABLES
WHERE         TABLE_SCHEMA = 'ABCDEFGH'
AND           TABLE_NAME IN ('ARCMNTST', 'ARIMSGT', 'ARTENT', 'ETC', 'ETC', 'ETC')
ORDER BY      TABLE_NAME
Задан 07/11/2018 в 20:00
источник пользователем
На других языках...                            


1 ответов

голоса
1

Динамический SQL не сложно ...

В принципе, построить свой SQL заявление в переменную строки. Использование CONCATдля включения значений из другого

@sqlStmt = 'Insert into mytable values (''ConstVal'',' concat SomeVar concat ')';

execute immediate @sqlStmt;

Загвоздка в том, что вы должны бежать строки, как «» ConstVal выше с двойными одинарными кавычками.

Другой улов в том , что вы не можете использовать , SELECTкак вы пытаетесь. Если вы имели только одну строку , чтобы вернуться, SELECT INTOбудет вариант для статического заявления. Но не поддерживается динамичным. Вы должны использовать динамический VALUES INTOвместо этого.

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

declare myCursor cursor for myStatement;

set @sqlStmt = 'select ....';
prepare myStatement into mySqlDescriptor from @SqlStmt;

open myCursor;
// done if you are returning the results
// assuming you want to process in your procedure..
// add a loop that does 
//   fetch next from myCursor into myData;

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

select table_name, number_rows 
from syspartitionstat
where table_schema = 'ABCDEFGH' 
      and TABLE_NAME in ('ARCMNTST', 'ARIMSGT', 'ARTENT', 'ETC', 'ETC', 'ETC');
Ответил 07/11/2018 в 21:34
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more