Сервис для
сео - оптимизаторов

Найди ошибки на сайте
Ошибки мешают продвижению сайта
Исправь ошибки на сайте
Сайт без ошибок продвигать легче
Получи новых клиентов
Новые клиенты принесут больше прибыль

Groovy и SQL * Plus

оракул «s SQL * Plus не так удобен, как Разработчик SQL или же JDeveloper для манипулирования данными в База данных Oracle , но это все еще обычно используется , По факту, SQL * Plus часто предпочтительнее инструментов с более изящными пользовательскими интерфейсами для быстрого и грязного манипулирования, для запуска сценариев SQL, для запуска в составе сценариев оболочки и для других неинтерактивных применений. Кроме того, Oracle Страница SQL * Plus звонки SQL * Plus «основной интерфейс к серверу базы данных Oracle». В этом посте я смотрю на использование SQL * Plus в сочетании с Groovy скрипты.

Groovy, Управление процессом играет наиболее важную роль в процессе использования Groovy с SQL * Plus. Эта функциональность легко применяется благодаря ГДК «s Удлинение строки это включает в себя выполнить () метод, который возвращает Процесс выполнение команды, содержащейся в этой GDK-расширенной строке. Этот механизм будет неоднократно использоваться в примерах в этом сообщении в блоге.

Примечания, относящиеся конкретно к Windows / Vista

Многие книги, блоги и статьи об использовании Groovy с Windows справедливо указывают на то, что некоторые из наиболее часто используемых команд в Windows на самом деле не являются исполняемыми файлами, а являются встроенными командами. Эти команды должны начинаться с cmd / C быть выполненным соответствующим образом. Однако этот шаг не требуется при вызове SQL * Plus из Groovy в Windows, поскольку SQL * Plus является отдельным исполняемым файлом.

При использовании Vista важно запускать SQL * Plus с соответствующими привилегиями. Поскольку сценарии Groovy в этом посте запускают SQL * Plus, сценарии должны выполняться в окне консоли, которое запускается с правами администратора. Сообщение об ошибке, включающее фразу «Запрошенная операция требует повышения прав», появляется, когда скрипты Groovy, использующие SQL * Plus, выполняются без соответствующих привилегий. Это продемонстрировано на следующем снимке экрана.

Это продемонстрировано на следующем снимке экрана

Пример 1: Базовый оператор запроса

Одним из самых простых способов использования SQL * Plus является написание файла, содержащего команды для запуска в SQL * Plus. Эти файлы часто заканчиваются суффиксом .sql и обычно выполняются в SQL * Plus, предварительно указав имя файла сценария (с путем, если файл не находится в текущем рабочем каталоге) с символом @.

В этом первом примере этот файл сценария SQL * Plus называется 01-employeeIds.sql и представляет собой однострочный сценарий:

01-employeeIds.sql

выберите employee_id из сотрудников;

Ожидается, что приведенный выше сценарий будет выполнен Образец схемы HR это поставляется с большинством современных версий базы данных Oracle. Groovy для запуска этого файла сценария SQL * Plus содержится в следующем листинге кода для sql01.groovy:

sql01.groovy

#! / usr / bin / env

Приведенный выше скрипт Groovy указывает явный вызов SQL * Plus с именем пользователя «hr» и соответствующим паролем «hr». Затем он запускает скрипт, показанный выше, предварительно добавив его имя с символом «@». Все это включено в расширенную строку GDK, для которой вызывается метод execute (). Объект, возвращаемый из этого вызова, является расширенным GDK экземпляром Process (как показано вызовом println ниже его экземпляра), из которого печатается каждая строка.

Первоначальные результаты запуска вышеуказанного скрипта показаны на следующем снимке экрана:

В приведенном выше выводе первая из многих строк, возвращаемых из базы данных, отображается после отображения баннера SQL * Plus, и отображается строка, показывающая, что метод GDK String.execute () возвращает java.lang.ProcessImpl.

При запуске, как показано выше, этот сценарий никогда не заканчивается, поскольку сеанс SQL * Plus никогда не завершается. Это легко решается добавлением слова «выход» в конец сценария SQL, что будет сделано в следующем примере. На следующем снимке экрана показано, как скрипт «зависает», если сеанс SQL * Plus не был явно закрыт.

На следующем снимке экрана показано, как скрипт «зависает», если сеанс SQL * Plus не был явно закрыт

Пример 2: Очистка вывода SQL * Plus

Мы часто не хотим, чтобы баннер SQL * Plus отображался при запуске SQL * Plus через скрипт. SQL * Plus предоставляет опцию -S для подавления этого баннера. Следующая версия скрипта Groovy будет использовать преимущества, показанные в sql02.groovy:

sql02.groovy

#! / usr / bin / env groovy def sqlplusCmd = "sqlplus -S hr / hr @ 02-employeeIds.sql" .execute () sqlplusCmd.in.eachLine {line -> println line}

Единственные изменения в этом сценарии из сценария Groovy в первом примере - это добавление -S для подавления баннера SQL * Plus и вызов другого файла сценария SQL (02-employeeIds.sql), который будет показан далее.

При запуске SQL * Plus со сценариями часто бывает удобно подавить другие части обратной связи в дополнение к подавлению баннера SQL * Plus. Многие из этих типов вывода отключаются или подавляются в SQL * Plus с помощью SET команда установить соответствующее свойство на желаемое значение. Листинг кода для 02-employeeIds.sql демонстрирует отключение обратной связи по результатам запроса, информации заголовка и разделения страниц в результатах SQL * Plus, а также явное завершение работы из SQL * Plus.

02-employeeIds.sql

- HEADING off отключает заголовки столбцов при выводе набора результатов запроса HEADING off - FEEDBACK отключает сообщение о том, что количество возвращенных строк установлено, отключено FEEDBACK - PAGESIZE до 0 удаляет пробелы между "страницами" набора результатов PAGESIZE 0 select employee_id из сотрудников ; - Вернуть настройки SQL * Plus к значениям по умолчанию, установленным HEADING для набора FEEDBACK 6, set PAGESIZE 14 exit.

Следующие два снимка экрана демонстрируют более скудный вывод с подавленным баннером SQL * Plus, без заголовков, разделения страниц и обратной связи. Второе изображение доказывает, что выход успешно завершает работу SQL * Plus (и вызывающего скрипта Groovy).

Второе изображение доказывает, что выход успешно завершает работу SQL * Plus (и вызывающего скрипта Groovy)

Пример 3: передача параметра

Часто бывает так, что мы хотим запускать сценарии SQL * Plus в зависимости от параметров, установленных динамически при выполнении сценария. SQL * Plus принимает параметры командной строки, и эта функция используется в следующем списке сценариев SQL.

03-employeeFind.sql

- HEADING off отключает заголовки столбцов при выводе набора результатов запроса HEADING off - FEEDBACK отключает сообщение о том, что количество возвращенных строк установлено, отключено FEEDBACK - PAGESIZE до 0 удаляет пробелы между "страницами" набора результатов PAGESIZE 0 select first_name || '' || last_name "NAME" от сотрудников, где employee_id = & 1; - Вернуть настройки SQL * Plus к значениям по умолчанию, установленным HEADING для набора FEEDBACK 6, set PAGESIZE 14 exit.

В приведенном выше сценарии полное имя сотрудника возвращается на основе предоставленного параметра (& 1), представляющего идентификатор сотрудника. Для поддержки этого ожидаемого параметра сценарий Groovy должен предоставить этот идентификатор сценарию SQL * Plus. Это показано в скрипте Groovy sql03.sql:

sql03.grooy

#! / usr / bin / env groovy if (! args) {println "Вы должны указать идентификатор интересующего сотрудника." System.exit (-1)} def sqlplusCmd = "sqlplus -S hr / hr @ 03-employeeFind.sql $ {args [0]}". Execute () sqlplusCmd.in.eachLine {line -> println line}

Этот сценарий Groovy быстро завершается, если не указан параметр, и информирует пользователя о том, что требуется идентификатор. Если идентификатор указан, он передается в сценарий SQL * Plus, добавляя его в конец вызова SQL * Plus. Вывод из этого показан далее.

Вывод из этого показан далее

Снимок экрана, только что показанный, демонстрирует, что передача параметров из командной строки в Groovy-скрипт в SQL * Plus работала нормально. Единственным недостатком является то, что подстановка переменных SQL * Plus показана явно, и это не всегда может быть желательно. Я могу отключить это, указав отключить VERIFY в скрипте SQL * Plus. Когда я это делаю, вывод будет таким, как показано ниже.

Когда я это делаю, вывод будет таким, как показано ниже

Пример 4: обработка кода возврата SQL * Plus

Поскольку возможности управления процессами Groovy использует расширенный GDK Процесс , Process.exitValue () Метод может использоваться для доступа к кодам, возвращаемым из вызванных команд. Это позволяет коду Groovy анализировать коды, возвращаемые из вызванного скрипта, и действовать соответствующим образом.

Чтобы проиллюстрировать это, сценарий SQL * Plus, использованный выше, изменен и возвращает -4. Модифицированная версия показана далее.

04-employeeFind.sql

- HEADING off отключает заголовки столбцов при выводе набора результатов запроса HEADING off - FEEDBACK отключает сообщение о количестве возвращаемых строк, установив FEEDBACK off - PAGESIZE в 0 удаляет пробелы между "страницами" набора результатов PAGESIZE 0 - VERIFY off отключает подсказки, показывающие набор подстановок переменных VERIFY off select first_name || '' || last_name "NAME" от сотрудников, где employee_id = & 1; - Вернуть настройки SQL * Plus к значениям по умолчанию. Установить HEADING для набора. ОБРАТНАЯ СВЯЗЬ. 6 Установить PAGESIZE 14. Установить VERIFY вкл.

Модифицированный скрипт Groovy, который использует Process.exitValue () для обработки этого возвращенного кода, показан далее. Этот скрипт Groovy просто печатает значение, но он может реализовать альтернативную логику на основе возвращенного кода.

sql04.groovy

#! / usr / bin / env groovy if (! args) {println "Вы должны указать идентификатор интересующего сотрудника." System.exit (-1)} def sqlplusCmd = "sqlplus -S hr / hr @ 04-employeeFind.sql $ {args [0]}". Execute () sqlplusCmd.in.eachLine {line -> println line} println " Возвращаемое значение: $ {sqlplusCmd.exitValue ()} "

Когда этот скрипт выполняется, его вывод выглядит так, как показано на следующем снимке экрана.

Когда этот скрипт выполняется, его вывод выглядит так, как показано на следующем снимке экрана

Пример 5: Обработка значимых выходных данных SQL * Plus

Бывают ситуации, когда скрипту Groovy нужно обрабатывать больше, чем код возврата. Один из способов сделать это состоит в том, чтобы скрипт SQL * Plus записывал данные во внешний файл, который может обрабатывать скрипт Groovy. Помогает, конечно, что Groovy предоставляет некоторые хорошие GDK Расширения файлов ,

Команда SQL * Plus SPOOL может использоваться для буферизации вывода в файл операционной системы.

Пример сценария SQL * Plus, который записывает фамилии и имена сотрудников, разделенные запятой, в отдельных строках файла с именем «name.txt» показан ниже.

05-employeeList.sql

- HEADING off отключает заголовки столбцов при выводе набора результатов запроса HEADING off - FEEDBACK отключает сообщение о количестве возвращаемых строк, установив FEEDBACK off - PAGESIZE в 0 удаляет пробелы между "страницами" набора результатов PAGESIZE 0 - VERIFY off отключает запросы, показывающие, что подстановка переменных установлена ​​в VERIFY, выключен - COLSEP устанавливает символ, который должен быть помещен между возвращаемыми столбцами, задает COLSEP, - TRIMSPOOL влияет только на вывод буферизации не SQL * Plus установить TRIMSPOOL на имя буферизации. txt выберите фамилию, имя и фамилию из сотрудников; отключить - вернуть значения по умолчанию для SQL * Plus. установить HEADING для набора FEEDBACK 6 установить PAGESIZE 14 установить VERIFY для набора COLSEP "" установить TRIMSPOOL выкл выход

Когда скрипт Groovy запускает этот файл, генерируется ожидаемый файл с именем name.txt. Часть этого (сверху и снизу) показана далее.

Абель, Эллен Анд, Сундар Аткинсон, Може Остин, Дэвид Бэр, Герман Байда, Шелли Банда, Амит Бейтс, Элизабет Белл, Сара Бернштейн, Дэвид Биссо, Лора Блум, Харрисон Булл, Алексис. , , Фольман, Шанта Уолш, Алана Вайс, Мэтью Уэйлен, Дженнифер Злоткей, Элени

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

sql05.groovy

#! / usr / bin / env groovy def sqlplusCmd = "sqlplus -S hr / hr @ 05-employeeList.sql" .execute () def file = новый файл ("name.txt") file.eachLine {println "Name ( Последнее, первое): $ {it} "}

Гораздо более сложная логика может быть выполнена с содержимым файла name.txt, но это демонстрирует, как легко исправить буферный вывод с помощью скрипта Groovy. Нижняя часть выполнения скрипта показана на следующем снимке экрана.

Заключение и заключительные замечания

Groovy и SQL * Plus могут эффективно использоваться для создания сценариев, связанных с данными. Groovy предлагает множество преимуществ традиционных языков сценариев при использовании в сочетании с SQL * Plus, но предлагает дополнительное преимущество, заключающееся в полном доступе к JVM и множеству библиотек Java. Groovy можно использовать с существующими сценариями SQL * Plus или напрямую обращаться к базе данных с помощью мощного и удобного JDBC абстракция GroovySql ,