Использование SQL-кода для генерации SQL-сценариев

Иногда бывает необходимо писать SQL-сценарии с рядом похожих строк. Хорошим примером может служить сценарий назначения набора привилегий сразу нескольким пользователям. Разумеется, для каждого пользователя можно выполнять отдельные SQL-операторы, но это длительное и утомительное занятие. К счастью, вместо этого доступен другой подход, который предусматривает применение SQL-кода для генерации сценария со всеми подлежащими выполнению операторами SQL. Под применением SQL-кода для генерации SQL-сценария, по сути, подразумевается использование вывода одного оператора SQL в качестве ввода для другого оператора SQL (подстановка вывода команд).

В написании SQL-кода, генерирующего в качестве вывода другой SQL-код, нет ничего сложного. Сначала пишется исходный код SQL. Далее создается файл, который будет использоваться для захвата вывода первого сценария SQL. Потом выполняется SQL-код, который будет генерировать в качестве вывода другой SQL-код. Окончательный набор представляющих интерес команд будет содержаться во втором, буферном (spooled) сценарии. Напоследок буферный сценарий, содержащий сгенерированный SQL-код,запускается.


Внимание! Обязательно отключите переменные среды ECHO, HEADING и FEEDBACK. Тогда буферный сценарий будет получаться чистым, благодаря чему его можно будет сразу же выполнять в том в виде, в котором он и есть, без внесения изменений.


Ниже приведен полезный пример применения этого приема.

1. Настраиваем переменные среды: 

SQL> SET ECHO OFF HEADING OFF FEEDBACK OFF

2. Указываем имя файла, в который должен записываться вывод первого сценария:

SQL> SPOOL test.txt 

3. Выполняем SQL-код, который генерирует другой SQL-код:

SQL> SELECT 'grant connect, resource to '||username||';' FROM dba_users; 

Ниже показана часть вывода предыдущей команды:

GRANT CONNECT, RESOURCE TO DBA1;
GRANT CONNECT, RESOURCE TO MAMIDI;
GRANT CONNECT, RESOURCE TO JEFFRESS;
GRANT CONNECT, RESOURCE TO CAMPBELL;
GRANT CONNECT, RESOURCE TO ALAPATI;
GRANT CONNECT, RESOURCE TO BOLLU;
GRANT CONNECT, RESOURCE TO BOGAVELLI;
SQL> SPOOL OFF 

4. Все показанные выше команды будут захвачены в буферный сценарий. Теперь выполняем этот сценарий (test.txt в настоящем примере):

SQL> @test.txt
Grant succeeded.
Grant succeeded.
Grant succeeded.
Grant succeeded.
Grant succeeded.
Grant succeeded.
Grant succeeded.
SQL> 

Нетрудно заметить, что в случае необходимости выполнения такой команды GRANT для сотен пользователей усилий потребовалось бы приложить ничуть не больше, чем для одного пользователя. Продемонстрированный выше прием можно легко адаптировать и применять при выполнении любых задач, которые охватывают одновременно набор объектов или пользователей в базе данных. Это очень полезный инструмент в арсенале администратора баз данных, который имеет массу применений в области решения повседневных административных задач.

Вас заинтересует / Intresting for you:

Решение проблем с неверно зада...
Решение проблем с неверно зада... 6653 просмотров Игорь Воронов Tue, 21 Nov 2017, 13:31:33
Управление томами Oracle ADVM ...
Управление томами Oracle ADVM ... 482 просмотров Андрей Васенин Wed, 02 Dec 2020, 09:58:23
Представления словаря данных д...
Представления словаря данных д... 2503 просмотров Antoniy Tue, 21 Nov 2017, 13:18:46
Кластерный фактор
Кластерный фактор 5878 просмотров Anna Tue, 21 Nov 2017, 13:32:12
Войдите чтобы комментировать