Иногда бывает необходимо писать 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 для сотен пользователей усилий потребовалось бы приложить ничуть не больше, чем для одного пользователя. Продемонстрированный выше прием можно легко адаптировать и применять при выполнении любых задач, которые охватывают одновременно набор объектов или пользователей в базе данных. Это очень полезный инструмент в арсенале администратора баз данных, который имеет массу применений в области решения повседневных административных задач.