Как в sqlplus запустить скрипт из файла

Обновлено: 05.07.2024

Я хотел бы запустить сценарий Oracle через SQL Plus через командную строку Windows. Сценарий не содержит команду «выход», но я все же хотел бы завершить работу SQL Plus, возвращая управление в командную строку по завершении сценария. Моя цель - сделать это без изменения скрипта. Это возможно?

Вы выполняете это с "sqlplus . <scriptname" или "sqlplus . @scriptname" ?? Я нахожу различные варианты поведения в зависимости от того, что вы делаете в Unix.

Другой способ - использовать эту команду в командном файле:

Здорово! Знаете ли вы, как «выход» добавляется к сеансу sqlplus? Команда sqlplus запускает скрипт, затем пытается прочитать больше команд из стандартного ввода. С этим конвейером чтение из стандартного ввода будет читать строку «exit» из команды echo, вызывая завершение sqlplus. Остерегайтесь того, что вы выставляете свой логин-пароль через список процессов в Unix (ps -ef), но я почти уверен, что он работает так же и в Windows

Я нашел, что это лучшее решение, и оно работает в терминале или в скрипте:

Это сработало для меня, и я нахожу это более элегантным, чем главный ответ, потому что это избегает «выхода».

Теперь, понимая, что ваша проблема может быть связана с самим файлом sql, вы должны понять, что для завершения работы sqlplus нужно указать. Я делаю это так:

(Косая черта важна. Она указывает sqlplus выполнить метки состояния над ней.)

Обратите внимание, что ответ Дейва Косты тоже работает: отправка выхода (или выхода) в команду sqlplus. Косая черта означает выполнение того, что находится в буфере SQL. Он не выполняет несколько операторов, и нет необходимости выполнять команды управления SQLPlus, такие как «выход». Если вы введете «quit» <Enter> в интерактивном приглашении SQLPlus, оно немедленно завершится.

Лучший способ скрыть информацию о пользователях и выходах:

exit выдается на выход sqlplus, заставляя его выйти. -S подавляет весь вывод сервера, кроме SQL-запроса в скрипте.

Если вы используете ssh - это выйти | вместо выхода | так что он не закроет ваш ssh-сеанс, если файл отредактирован позже, чтобы иметь выход или выход в нем. Это работает, если файл тоже не найден.

Вы также можете сделать это в вашем сценарии оболочки.

Вам может понадобиться убежать от ";" с \.

Да, это возможно - сгенерировать скрипт-обертку, который соответствующим образом настраивает SQLPlus, включает ваш скрипт (т.е. @YourTargetScript.sql ), а затем выполняет выход.

Тем не менее, я не рекомендую этот подход вообще - у SQLPlus есть очень много проблем для программного использования; при написании сценариев оболочки в прошлом, которые использовали Oracle, я построил оболочку Python вокруг нее (добавив более разумное поведение при обработке ошибок, разумное разделение вывода между stdout / stderr, встроенную поддержку вывода CSV и другие подобные вкусности), и это сработало намного лучше.

С любой другой программой я бы с тобой согласился. НО я обнаружил, что SQLPlus дал мне полезный контекст для некорректного запроса, чего не было в других средах (в моем случае Perl / DBI / DBD :: Oracle). Если вы делаете осторожную обработку ошибок, это может стоить боли. Кроме того, в зависимости от степени контроля над сервером вы можете или не можете предполагать наличие чего-либо большего, чем командная оболочка и SQLPlus. Многие более скромные Unix-магазины, работающие под управлением Solaris, HP / UX, AIX и т. П., Используют очень простые установки и не позволяют устанавливать что-либо еще на коробке. Обратите внимание, что иногда это можно обойти, просто добавив в приложение минимальный интерпретатор.

Если вы поместите это в пакетный файл, контроль продолжится с оператором (ами), следующим за ним.

SQL*Plus - программа для работы с СУБД Oracle посредством командной строки. Используя SQL*Plus можно выполнять команды SQL и PL/SQL в интерактивном режиме или используя сценарий.

Основное преимущество SLQ*Plus - доступность, т.к. инструмент доступен практически всегда, когда в системе установлен Oracle. При этом это достаточно мощный инструмент, используя который можно решать различные задачи на удаленных машинах.

К написанию этой статьи меня подтолкнула книга "Oracle SQL*Plus: The Definitive Guide, 2nd Edition", написанная Jonathan Gennick. Как обычно, появилось желание систематизировать информацию и представить ее в удобном виде.

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

Область возможного использования SQLplus при этом гораздо шире, например - построение отчетов, в том числе в формате HTML.

Параметры, подключение к базе, запуск скриптов

Выполнить несколько строк кода (не передавая отдельный файл со скриптом), unix:

Выполнение SQL запросов

Запрос может состоять из нескольких строк, содержать комментарии, но не может содержать внутри пустые строки.

Запрос может быть выполнен тремя способами:

  • точка с запятой в конце запроса
  • строка с слешем "/" после запроса
  • пустая строка после запроса (будет помещен в буфер, но не выполнен немедленно)

Выполнение PL/SQL блоков

Пример PL/SQL блока:

Правила выполнения PL/SQL блоков:

  • Первое слово в PL/SQL блоке должно быть из списка: BEGIN, DECLARE, CREATE PROCEDURE,
    CREATE FUNCTION, CREATE TRIGGER, CREATE PACKAGE, CREATE TYPE, CREATE TYPE BODY. Регистр не важен.
  • Блок может состоять из нескольких строк
  • Можно вставлять /* комментарии */, они также могут быть на несколько строк
  • Пустые строки не разрешены внутри блока

Сигнал к выполнению блока может быть подан двумя путями:

  • Строка, содержащая только слеш "/" после блока - выполнить сразу
  • Строка, содержащая точку "." после блока - поместить в буфер. Содержимое буфера может быть выведено командой LIST и выполнено, путем указания одиночного слеша "/" или команды RUN.

Одиночное выражение PL/SQL может быть выполнено, используя:

В случае ошибок, при выполнении процедуры, можно отобразить их выполнив команду:

Работа с переменными

Переменные могут быть заданы двумя способами:

Если уже была определена &&variable, то значение будет подставлено во все дальнейшие переменные как &variable так и &&variable.

Если была определена &&variable, и скрипт запущен повтороно в ходе той же сессии работы с SQLplus - будет использовано старое значение переменной. Чтобы этого избежать - можно запрашивать интерактивный ввод в скрипте принудительно, испольтзуя команду:

ACCEPT можно использовать для валидации:

Для ввода дат в определенном формате:

SQL*Plus поддерживает четыре типа переменных: CHAR, NUMBER, BINARY_FLOAT, and BINARY_DOUBLE. При вводе с клавиатуры переменная будет типа CHAR.

Несмотря на это, можно использовать NEW_VALUE, чтобы задать числовую переменную, полученную как результат запроса.

Bind-переменные могут использоваться для передачи данных между PL/SQL и SQL блоками:

Присвоить bind-переменной значение &-переменной:

Вывести значение bind-переменной:

Присвоить &-переменной значение bind-переменной:

Получаем OUT-параметр процедуры в bind-переменную:

Условное выполнение в SQLplus:

Пример скрипта, принимающего несколько переменных на вход в формате c возможностью задать дефолтные значения:

Настройки выполнения скриптов

Действуют на протяжении сессии в SQLplus.

Запомнить настройки перед выполнением скрипта и вернуть обратно по завершении выполнения:

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

Набрав в приглашении команду edit (или ed), можно вызывать редактор по умолчанию (каковым в UNIX обычно является vi, а в Windows — Notepad (Блокнот)) и затем вводить желаемые команды и сохранять их файле, чтобы впоследствии выполнить их.

Имя редактора по умолчанию можно изменить, причем как в файле glogin.sql или login.sql, так и непосредственно после входа в SQL*Plus.

Сохранение содержимого буфера SQL в файл

Часто при написании довольно сложных сценариев бывает удобно сохранять содержимое буфера SQL в файле. Это позволяет извлекать этот файл и работать с ним позже или применять его для автоматизированного выполнения. Для сохранения содержимого буфера SQL служит команда SAVE. Ниже приведен простой пример:

После ввода кода SQL можно ввести в новой строке символ точки (.), который свидетельствует о завершении написания блока кода SQL. При вводе команды SAVE имя_файла все содержимое буфера SQL сохраняется в файле с указанным именем, каковым в данном случае является status.sql.

Обратите внимание, что вместе с командой SAVE, как было показано в предыдущем примере, по умолчанию используется параметр CREATE, указывающий, что требуется создать новый файл по имени status.sql. Однако если файл с именем status.sql уже существует, тогда команду SAVE нужно использовать с параметром REPLACE. Если же требуется добавить содержимое в существующий файл, тогда следует применять вместе с командой SAVE параметр APPEND. Ниже приведены соответствующие примеры:

Выполнение сценариев SQL в SQL*Plus

Выполнить сценарий SQL можно двумя способами.

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

В системах UNIX для указания SQL*Plus места, где следует искать сценарии, служит переменная ORACLE_PATH. Это позволяет размещать все стандартные сценарии SQL в одном месте и избавляться от необходимости указывать полный путь к ним всякий раз,когда требуется выполнить какой-то из них. Например, переменную ORACLE_PATH можно настроить следующим образом:

В системах Windows значение для переменной ORACLE_PATH устанавливается за счет редактирования системного реестра Windows.

В листинге ниже показан пример выполнения сценария status.sql, в котором предполагается, что сценарий расположен в том же каталоге, из которого был запущен сеанс SQL*Plus.

Сценарий status.sql в листинге 4.9 запускается без указания информации о пути,поскольку он находится в том же каталоге, из которого был запущен сеанс SQL*Plus.Запустить сценарий, расположенный в другом каталоге, можно путем ввода полного пути к тому месту, в котором он находится, например:

Сценарий status.sql также запускается и с помощью команды run status.sql.Команда RUN приводит к выполнению содержимого указанного файла. В случае если необходимые команды SQL фактически отображаются на экране (т.е. хранятся в буфере SQL*Plus), для их выполнения можно воспользоваться командой /. В листинге ниже показан пример применения этой команды. Обратите внимание, что в случае применения этой команды для запуска сценария команды больше на экране не отображаются.Вместо этого, команда / выполняет содержимое буфера SQL*Plus.

В этом листинге вместо команды / можно также использовать команду RUN. В отличие от команды /, которая не предусматривает отображение выполняемого ею содержимого буфера SQL*Plus, RUN всегда выводит на экран содержимое сценария, который только что выполнила. Пример применения команды RUN приведен в листинге ниже.

Внимание! При вызове сценария с помощью команды RUN перед выполнением содержимое SQL сначала отображается на экране. В случае применения команды / сценарий выполняется незамедлительно безо всякого предварительного отображения его SQL-содержимого. Из-за этого при использовании команды / необходимо соблюдать чрезвычайную осторожность, поскольку находящийся в буфере сценарий может оказаться совсем не тем, который требовалось выполнить.

image

1. Отобразите справку SQLPLUS, команда имеет следующий вид: HELP INDEX

2. Проверьте введение и синтаксис соответствующих команд, команда выглядит следующим образом: HELP start

3. @ равно команде запуска, запустить файл сценария sql, вы можете вызвать файл в текущем каталоге или по указанному пути

4、@@ < url| file_name[.ext] >[arg . ]


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

5. Повторно запустите последнюю команду sql.

6, напишите интерактивную команду принять

7. a [ppend] Добавить указанный текст после текущей строки буфера sql

8. Запуск или остановка автоматического архивирования онлайн-журналов повторного выполнения, ручное (отображение) архивирование указанных журналов повторного выполнения или отображение информации о файлах журнала повторного выполнения.

9. Заблокируйте то же значение, отображаемое в столбце BREAK ON break_column

10. BTI [TLE] [printspec [текст | переменная] . ] | [ON | OFF] Установите форматированный нижний колонтитул

11、C[HANGE] sepchar old [sepchar [new [sepchar]]]

image

12. Сбросить текущее значение параметра CL [EAR] .

image
image

13, команда COL: форматирование формы отображения столбца

1). Измените заголовок столбца по умолчанию.

2). Измените имя столбца ENAME на новое имя столбца EMPLOYEE NAME и поместите новое имя столбца в две строки

3). Измените длину отображения столбца.

4). Установите выравнивание заголовков столбцов JUS [TIFY]

5). Не позволять отображать одну колонку на экране NOPRI [NT] | PRI [NT]

6). Отформатируйте отображение столбца типа ЧИСЛО (9999,99, 999 999,0, 999 999,00 долларов США, 0000,00, aXX, гггг-мм-дд чч24: ми: сс).

7). При отображении значения столбца, если значение столбца имеет значение NULL, замените значение NULL на текстовое значение.

8). Установите для атрибутов отображения всех столбцов значения по умолчанию.


SQL> CLEAR COLUMNS

14. Если вы использовали команду break для разделения строк в отчетах на наборы, вы можете выполнить вычисления для каждого подмножества. вычислить

15, подключитесь к базе данных, подключитесь

16, определите пользовательскую переменную DEFINE

17, удалить текущую строку


del
del n
del m n

18. Показать структуру таблицы ОПИСАТЬ


SQL> desc table_name

19. Отключить разъединитель

20. Отредактируйте текущий ввод

21, выполните хранимую процедуру EXECUTE

image

22. Выйдите из sqlplus и используйте EXIT.

23. Импортируйте оператор sql файла в буфер sql и получите имя_файла

24. Не выходя из sql * plus, выполните в sql * plus команду операционной системы:

25. Добавьте одну или несколько строк ниже текущей строки sql-буфера i [nput]

26. Отобразите оператор sql в буфере sql, список n отображает n-ю строку в буфере sql и делает n-ю строку текущей строкой.

27. Приостановите процесс выполнения и продолжите выполнение после ожидания ответа пользователя.

28, отображение переменных привязки печати

PL/SQL procedure successfully completed.

29. Вывести на экран указанную информацию или пустую строку.

30, выход выйти

31. Выполните только что выполненный оператор SQL еще раз.

32. Сохраните оператор sql в буфере sql в файл.

33. Завершите работу базы данных SHUTDOWN.

34. Вывести отображаемый контент в указанный файл.


SQL> SPOOL file_name
Все содержимое экрана содержится в файле, включая введенный вами оператор SQL.

Вывод катушки выключен
SQL> SPOOL OFF
Только когда вывод спула выключен, содержимое вывода будет видно в файле вывода.

35. Откройте базу данных ЗАПУСК.

36. В sql * plus переключитесь в командную строку операционной системы, после выполнения команды операционной системы вы можете снова переключиться на sql * plus:

37. Установите верхний заголовок каждого отчета.

38. Отображение значения системной переменной sql * plus или значения переменной среды sql * plus.

1). Показать значение текущей переменной окружения:

2). Отобразите значение параметра инициализации:


show PARAMETERS [parameter_name]

3) .Показать версию базы данных:

4). Отображение размера SGA

5). Отображение текущего имени пользователя.

39. Команда Set через переменную SET может установить специальную среду для SQL * PLUS.

arraysize

Количество строк, извлекаемых из базы данных за один раз, значение по умолчанию - 20, максимальное значение - 5000, чем больше значение, тем больше требуется памяти, что может повысить эффективность запроса. Когда он превышает 1000, эффект невелик.

autocommit

linesize

Количество символов, отображаемых в одной строке, значение по умолчанию - 80

пример:
SET LIN[ESIZE] <80|n>
Если выводимое содержимое строки превышает количество символов, которое может быть установлено в строке, оно будет отображаться в виде разрыва строки.

feedback

Отображать ли количество строк, запрошенных или измененных оператором SQL, то есть количество записей, возвращаемых запросом, включено - включено, выключено - выключено

SET FEED[BACK] <6|n|ON|OFF>
По умолчанию количество строк результата отображается только тогда, когда результат превышает 6 строк. Если установить обратную связь 1, она будет возвращаться независимо от количества запрошенных строк. Когда он выключен, количество строк в запросе никогда не отображается.

пример:
show feedback
select * from scott.dept;
set feedback off
select * from scott.dept;

Отображать ли вывод во время хранения, отключение запрещено, на выводе на дисплеи

пример:
show serveroutput

pagesize

Установите количество строк на странице, если оно установлено на 0, тогда весь выходной контент будет одной страницей, и заголовки столбцов не отображаются

trimout

Разрешены ли пробелы в конце каждой строки, on удаляет пробелы в конце каждой строки в выводе перенаправления (спула), а off позволяет отображать пробелы в конце

heading

Следует ли печатать заголовки столбцов в отчете, то есть отображать ли имена столбцов каждой строки в отчете, чтобы печатать заголовки столбцов, выключено запрещает печать заголовков столбцов

verify


Отображать ли операторы до и после замены переменной подстановки, отображать (значение по умолчанию), отключено запрещает перечисление

40 OPERATIONS BOSTON


Следует ли многократно отображать выполняемый оператор SQL, относится к тому, перечисляет ли команда start каждую строку команд в файле, on перечисляет команды, а off запрещает список

10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON


отображает дату, на отображает текущее время, выкл. запрещает отображение

пример:
показать время
set time on|off

timing


показывает время выполнения, on показывает время выполнения команды sql или блока pl / sql, off запрещено

пример:
set TIMING ON


Следует ли усекать элемент данных, отключать усечение элемента данных, включение позволяет изменить элемент данных на следующую строку, если длина выходной строки больше установленной длины строки (команда set linesize n). При включении переноса символы в строке вывода будут отображаться в другой строке, в противном случае символы в строке вывода будут обрезаны и не отображаться.

пример:
SET WRA[P] ON

sqlprompt


Установить командную строку sqlplus

newpage


Количество пустых строк, которые должны быть напечатаны между заголовком и верхним заголовком каждой страницы, 0 означает разрыв строки между страницами.
Установите разделение между страницами
SQL> SET NEWP[AGE] <1|n|NONE>
При установке новой страницы n между страницей и страницей будет n пустых строк.
Если установить новую страницу none, между страницей и страницей не будет промежутка.

showmode


При выполнении команды set, следует ли отображать новое значение и старое значение

sqlcase
Преобразование регистра команды sql и блока pl / sql перед выполнением команды

numformat Числовой формат


Установить формат отображаемого значения по умолчанию

numwidth


Ширина по умолчанию для настройки отображаемого значения

подчеркивание


Следует ли подчеркивать заголовки столбцов

DEPTNO DNAME LOC
10.00 ACCOUNTING NEW YORK
20.00 RESEARCH DALLAS
30.00 SALES CHICAGO
40.00 OPERATIONS BOSTON


Как отформатировать пустое пространство в выводе, использовать символы табуляции для включения и пробелы для выключения

sqlnumber
При выполнении sql или pl / sql установите подсказку для второй и последующих строк, на подсказках - номер строки, на подсказках - на значение sqlprompt

define


в командах сканирования для замены переменных и их значений.
off не проверяет команды, заменяющие переменные, и не использует вместо них их значения.

сканирование


Следует ли сканировать существующие переменные и значения подстановки, выключено запрещает обработку переменных и значений подстановки, а включено разрешает обработку

пробел


Установите количество пробелов между выходными столбцами, максимальное значение - 10

Читайте также: