SQLplus с человеческим лицом
Oracle SQL*plus кошмарен и сложен в установке, что и подвигло меня на написание этой памятки.
Установка
Утилита входит в состав СУБД Оракл и описанное ниже необходимо, если вам не нужна развернутая на вашем компьютере СУБД, а только sqlplus для усправления удаленной БД.
Скачать http://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html и установить его
sudo apt-get install alien sudo alien -i oracle-instantclient*-sqlplus*.rpm sudo apt-get install libaio1 sudo sensible-editor /etc/ld.so.conf.d/oracle.conf # указать в файле путь /usr/lib/oracle/12.2/client64/lib/ sudo ldconfig sudo ln -s /usr/bin/sqlplus64 /usr/bin/sqlplus
Добавить в .bashrc
export ORACLE_HOME=/usr/lib/oracle/12.2/client64/lib export LD_LIBRARY_PATH="$ORACLE_HOME" export LD_LIBRARY_PATH="$ORACLE_HOME" export TNS_ADMIN=$ORACLE_HOME/admin/network
Сохранить в файле $ORACLE_HOME/admin/network/tnsnames.ora параметры соединения с ваше БД:
your_db_name = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(Host = localhost)(Port = 1521)) (SERVER=DEDICATED) ) (CONNECT_DATA = (SERVICE_NAME = your_db)) )
Использование
После этого с БД в режиме суперпользователя можно соединиться:
sqlplus sys/sys_password@your_db_name as SYSDBA
Чтобы работала история команд (по стрелке вверх) и автодополнение (по TAB ) устанавливаем rlwrap :
sudo apt-get install rlwrap
Слова для автодополнения (разделенные пробелами или новыми строками) помещаем в
~/.command_completions
Для удоства создаем alias sql :
alias -p sql='rlwrap -f ~/.command_completions sqlplus'
Памятка про sys
Чтобы соединиться удаленно как супер-пользователь БД (SYSDBA) не с той машины, где работает СУБД, надо установить пользователю sys внешний пароль. Поскольку изначально у него пароль, с которым можно войти только локально.
Внешний пароль который мы установим (в данношм случае sys_password ) перекроет старый пароль и для внутренних логинов:
alter user sys identified by sys_password;
Ошибки компиляции
Если найдены ошибки при компиляции пакета, sqlplus пишет только “Warning: Package created with compilation errors.”.
Чтобы увидеть сами ошибки надо использовать:
select * from dba_errors order by sequence;
Настройки
SET AUTOCOMMIT 1; — коммит после каждой строки, полезно если выполняются взаимозависимые insert.
/ надо добавлять после кода процедур и пакетов, чтобы они были скомпилированы.
EXIT удобно добавлять внутрь скриптового файла (передаваемого в командной строке как @file_name ), чтобы SQLplus завершил работу после его выполнения.
Использование SQL*Plus и Oracle Enterprise Manager
Подключаться и работать с базами данных Oracle можно многими способами.Однако чаще всего для этого применяется предлагаемый в Oracle интерфейс и набор команд SQL*Plus. Интерфейс SQL*Plus, по сути, открывает окно в базу данных Oracle и потому очень широко используется разработчиками Oracle для создания программных единиц SQL и PL/SQL. Для администраторов баз данных Oracle этот интерфейс тоже является очень ценным инструментом по следующим причинам.
- Он позволяет выполнять запросы на языке SQL и блоки кода на языке PL/SQL (который представляет собой предлагаемую в Oracle расширенную процедурную версию языка SQL) и получать результаты.
- Он позволяет выполнять команды, связанные с администрированием баз данных,и автоматизировать их.
- Он позволяет запускать и завершать работу базы данных.
- Он предоставляет удобный способ для создания отчетов по администрированию баз данных.
В этой статье я начинаю рассказывать о том, как использовать SQL*Plus для выполнения типичных задач по администрированию баз данных Oracle, о важных командах SQL*Plus, а также, вкратце, о том, как с помощью SQL*Plus создавать отчеты. Возможно, применять интерфейс SQL*Plus для создания большинства отчетов и не придется, но знать,как работают его многочисленные средства для генерации отчетов, совершенно не помешает.
Запуск сеанса SQL*Plus
Интерфейс SQL*Plus представляет собой утилиту, которая чаще всего применяется для подключения и работы с базами данных Oracle. Он поставляется в составе как серверного программного обеспечения Oracle Database 11g, так и клиентского программного обеспечения Oracle Client, а также нового программного обеспечения Oracle Instant Client.
После установки SQL*Plus на сервере или клиентской машине процесс подключения к серверу или клиенту и запуска сеанса SQL*Plus выглядит очень просто. Из-за того, что каждый сеанс SQL*Plus подразумевает установку соединения с базой данных (если только не применяется параметр /NOLOG), все, что требуется для запуска SQL*Plus и подключения к базе данных — это действительное имя пользователя и пароль.
Настройка среды
Перед вызовом SQL*Plus потребуется сначала правильно настроить среду Oracle.В частности, необходимо установить значения для таких переменных среды, как ORACLE_SID, ORACLE_HOME и LD_LIBRARY_PATH. Помимо этого иногда нужно установить значения и для таких переменных среды, как NLS_LANG и ORA_NLS11.
В случае не установки правильных значений для необходимых переменных среды будет возникать ошибка. Например, не установка надлежащего значения для переменной ORACLE_HOME перед запуском SQL*Plus будет приводить к появлению следующей ошибки:
$ sqlplus Error 6 initializing SQL*Plus Message file sp1.msb not found SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory Ошибка 6 при инициализации SQL*Plus Не удалось обнаружить файл sp1.msb SP2-0750: Возможно, требуется указать в ORACLE_HOME каталог, в котором установлено программное обеспечение Oracle
В случае получения показной выше ошибки достаточно установить значение для переменной среды ORACLE_HOME:
$ export ORACLE_HOME= /u01/app/oracle/product/11.1.0/db_1
Программное обеспечение SQL*Plus Instant Client
Для использования SQL*Plus инсталлировать полностью все серверное программное обеспечение Oracle Database вовсе не обязательно. Если нужно взаимодействовать через интерфейс SQL*Plus с базой данных, которая находится на другом сервере,вполне хватит и программного обеспечения SQL*Plus Instant Client. С помощью этого программного обеспечения к любой базе данных Oracle, функционирующей под управлением любой операционной системы, можно подключаться удаленным образом за счет указания ее имени и применения идентификатора сетевого подключения Oracle.Единственным требованием для подключения к удаленной базе данных подобным образом является указание имени удаленной базы данных в файле tnsnames.ora. Именно поэтому для SQL*Plus Instant Client требуется задавать переменную среды ORACLE_HOME.Существует также метод, который не требует применения на клиентском сервере файла tnsnames.ora. Называется он методом простого подключения (easy connect). Ниже приведен пример, показывающий, как с помощью идентификатора простого подключения установить от имени пользователя OE подключение к базе данных testdb, расположенной на сервере myserver:
$ sqlplus oe/oe@//myserver.mydomain:1521/testdb
В этом примере 1521 — это порт, используемый слушателем для получения запросов на установку подключения.
Запуск сеанса SQL*Plus из командной строки
Прежде чем подключаться к сеансу SQL*Plus, необходимо сначала правильно настроить среду и указать, с какой базой данных на сервере должно устанавливаться соединение по умолчанию. Делается это с помощью переменной среды ORACLE_SID.
$ ORACLE_SID=orcl $ export ORACLE_SID
После указания базы данных, которая должна использоваться по умолчанию (в приведенном примере это orcl) в переменной среды ORACLE_SID, можно получать доступ к SQL*Plus из приглашения командной строки, просто вводя команду sqlplus безо имени пользователя и пароля. SQL*Plus предложит ввести имя пользователя и пароль. В случае предоставления имени пользователя вместе с командой (например: sqlplus salapati),SQL*Plus будет приглашать ввести только пароль. Администратор баз данных должен входить от имени одной из административных учетных записей.
На заметку! На серверах UNIX ввод должен обязательно выполняться в нижнем регистре. В Windows интерфейс не чувствителен к регистру символов. За исключением этой небольшой детали, во всем остальном командный интерфейс SQL*Plus работает одинаково и на платформе Windows, и на всех вариантах платформ UNIX и Linux.
Разумеется, вводить имя пользователя и пароль можно и непосредственно при вызове SQL*Plus, но тогда пароль будет виден другим при его вводе. Ниже приведен пример:
$ sqlplus salapati/sammyy1 SQL>
Приглашение SQL (SQL>) означает, что соединение с SQL*Plus инициировано, и можно начинать вводить команды и операторы SQL, PL/SQL и SQL*Plus.
Для того чтобы подключиться к другой базе данных, а не той, что установлена по умолчанию, нужно использовать следующую команду:
$ sqlplus имя_пользователя@идентификатор_подключения
Определенные операции, например запуск и завершение работы, разрешено выполнять только в случае подключения к SQL*Plus с привилегиями SYSDBA или SYSOPER. При наличии привилегий SYSDBA (или SYSOPER) подключаться к SQL*Plus можно следующим образом:
$ sqlplus sys/sammyy1 AS SYSDBA SQL> SHO USER USER is "SYS" SQL>
Конструкция AS позволяет устанавливать привилегированные подключения пользователям, которым были выданы системные привилегии SYSDBA или SYSOPER.
Если в базе данных была создана учетная запись аутентифицированного пользователя операционной системы (ранее называвшаяся OPS$имя; см. главу 12), устанавливать подключение можно и просто указанием символа косой черты (/), как показано ниже:
$ sqlplus / SQL> SHO USER USER is "OPS$ORACLE" SQL>
Можно также подключаться через метод аутентификации операционной системы, за счет включения владельца программного обеспечения Oracle в группу администраторов баз данных (DBA):
$ sqlplus / AS SYSDBA SQL> SHO USER USER is "SYS" SQL>
Обратите внимание, что во всех предыдущих примерах имя базы данных при подключении через SLQ*Plus не указывалось. Объясняется это тем, что подключение устанавливалось к принятому по умолчанию экземпляру, т.е. к базе данных, на которую указывает значение переменной среды ORACLE_SID. Указывать имя базы данных при использовании SQL*Plus для подключения к принятой по умолчанию базе данных не обязательно. Для подключения к другой базе данных, доступной по сети, нужно обязательно использовать идентификатор подключения (имя сетевой службы).
На заметку! Имя экземпляра, имя базы данных и имя службы могут как совпадать, так и отличаться.
С теоретической точки зрения, подключаться к базе данных можно с использованием полного синтаксиса идентификатора подключения, как показано в следующем примере, где для подключения к базе данных orcl применяется весь адрес целиком:
$ sqlplus salapati/sammyy1@(DESCRIPTION = (ADDRESS=(PROTOCOL=tcp)(HOST=sales-server)(PORT=1521) (CONNECT_DATA= (SERVICE_NAME=orcl.mycompany.com)))
Однако за счет использования имени сетевой службы, определенного в сетевом файле tnsnames.ora, можно подключаться к базе данных более простым образом:
$ sqlplus salapati/sammyy1@orcl
Кроме того, для подключения к базе данных можно применять простой метод подключения. Синтаксис простого метода подключения выглядит так:
$ [//]хост[:порт][/[имя_службы]]
Например, вот как подключиться с помощью этого метода к базе данных orcl:
$ sqlplus hr/hr_passwd@sales-server:1521/orcl.mycompany.com
Обратите внимание, что в случае применения простого метода подключения сетевой файл (tnsnames.ora) не нужен.
Какой бы из перечисленных методов не использовался, в конечном итоге будет обязательно успешно устанавливаться сеанс SQL*Plus либо с базой данных по умолчанию,либо с той, что была указана в идентификаторе подключения.
Установка подключения с помощью команды CONNECT
В SQL*Plus поддерживается команда CONNECT, которая позволяет после входа в SQL*Plus выполнять подключение от имени другого пользователя. Кроме того, она позволяет после подключения к одной базе данных подключаться к другой базе данных.Ниже приведен пример использования команды CONNECT для выполнения подключения от имени другого пользователя:
SQL> CONNECT новый_пользователь/пароль Connected. SQL>
Следующий пример демонстрирует, как в SQL*Plus подключаться к другой базе данных за счет предоставления идентификатора подключения в виде части команды CONNECT:
SQL> CONNECT salapati/sammyy1@orcl Connected. SQL>
Перед подключением к другой базе данных необходимо проверять, что в файле tnsnames.ora присутствует необходимая информация о подключении к удаленной базе данных.
Команду CONNECT можно использовать в SQL*Plus вместе с синтаксисом / AS SYSDBA и / AS SYSOPER, как показано ниже:
CONNECT sys/sammy1@prod1 as sysdba CONNECT / AS SYSDBA CONNECT пользователь/пароль AS SYSDBA CONNECT / AS SYSOPER CONNECT пользователь/пароль AS SYSOPER
Запуск сеанса SQL*Plus без установки подключения к базе данных с помощью параметра /NOLOG
Сеанс SQL*Plus можно также запускать и без установки подключения к базе данных,счет указав вместе с командой sqlplus параметр /NOLOG. В подобном может возникать необходимость, например, при запуске базе данных или просто для использования доступных в SQL*Plus команд для записи или редактирования сценариев. После запуска сеанса SQL*Plus для подключения к базе данных всегда можно применить команду CONNECT.
Ниже приведен пример использования параметра /NOLOG:
$ sqlplus /NOLOG SQL*Plus: Release 11.1.0.6.0 - Production on Wed Jan 2 18:35:25 2008 Copyright (c) 1982, 2007, Oracle. All rights reserved. SQL> SHO USER USER is " " SQL> SHO SGA SP2-0640: Not connected SQL> CONNECT salapati/sammyy1 Connected. SQL>
Подключение к SQL*Plus через графический интерфейс Windows
В случае использования графического интерфейса SQL*Plus на машине Windows для запуска сеанса SQL*Plus достаточно щелкнуть на пиктограмме SQL*Plus и на экране появится приглашение ввести имя пользователя. При условии, что соединение с базой данных устанавливается через соответствующие сущности в файле tnsnames.ora , после ввода имени пользователя можно приступать к работе с интерфейсом SQL*Plus.
Работать с утилитой SQL*Plus можно как в ручном, так и в сценарном не интерактивном режиме. Само собой разумеется, что уязвимые административные задачи, вроде восстановления базы данных, лучше выполнять в интерактивном режиме. Что же касается рутинных операций по обработке SQL, то их выполнение лучше автоматизировать с помощью сценариев. И в том и в другой случае сами команды будут выглядеть одинаково — отличаться будет лишь режим, в котором они будут выполняться.
Ниже показан синтаксис команды подключения к SQL*Plus:
CONN[ECT] [ < регистрационное_имя | / >[AS ]]
На заметку! В Oracle Database 11g команда SQLPLUS поддерживает новый аргумент -F, позволяющий SQL*Plus получать от базы данных RAC события FAN (Fast Application Notification — быстрое уведомление приложений).
Подключаться от имени пользователя с привилегиями SYSOPER, SYSDBA или SYSASM необходимо для выполнения привилегированных операций, вроде завершения работы и запуска базы данных или резервного копирования либо восстановления базы данных.Привилегия SYSAM является новой в Oracle Database 11g и предназначена для разделения обычных операций по администрированию баз данных и операций автоматического управления памятью (Automatic Storage Management — ASM).
Работа в SQL*Plus
После подключения к интерфейсу SQL*Plus можно начинать вводить в нем любые команды SQL*Plus, SQL или PL/SQL. Как будет объясняться позже в этой главе, операторы SQL оканчиваются либо символом точки с запятой (;), либо символом косой черты (/), а блоки кода PL/SQL — только символом косой черты (/). Вывод можно как просматривать на экране, так и при желании записывать в файл. Команды SQL*Plus всегда оканчиваются символов новой строки. При вводе команды SQL*Plus клиентская программа SQL*Plus анализирует ее, и если та представляет собой оператор SQL или PL/SQL, отправляет ее серверу баз данных для обработки.
В качестве символа продолжения можно использовать дефис (-), хотя при окончании первой строки применять символ продолжения вовсе не обязательно. В каждой строке SQL можно вводить любое количество символов или слов и затем просто нажимать клавишу для продолжения на следующей строке. SQL*Plus будет автоматически добавлять перед каждой строкой ее номер.В некоторых случаях, однако, символ продолжения (-) оказывается полезным, как в следующем примере, где требуется ввести SQL-оператор SELECT 200 — 100 FROM dual:
SQL> SELECT 200 - > 100 from dual; select 200 100 from dual * ERROR at line 1: ORA-00923: FROM keyword not found where expected Не удалось обнаружить ключевое слово FROM там, где оно ожидалось SQL>
В этом примере из-за перехода на вторую строку после дефиса (-), который еще так же является и знаком минус, утилита SQL*Plus автоматически интерпретировала его как символ продолжения и выдала ошибку, потому что оператор получился синтаксически некорректным (select 200 100 from dual). Избежать этой проблемы можно за счет использования в конце первой строки второго дефиса (знака минус) для выполнения роли символа продолжения:
SQL> SELECT 200 - - > 100 FROM dual; 200-100 ---------- 100 SQL>
В Oracle для выполнения определенных запросов необходимо использовать таблицу DUAL, поскольку в поддерживаемом Oracle синтаксисе SQL наличие конструкции FROM в операторе SELECT является обязательным (например, SELECT sysdate FROM dual;).В базах данных Microsoft SQL Server, с другой стороны, использовать таблицу DUAL не требуется, потому что в синтаксисе SQL Server допускается применение операторов SELECT без конструкции FROM.
Завершение сеанса SQL*Plus
Завершается сеанс SQL*Plus вводом команды EXIT, причем как в нижнем, так и в верхнем регистре. С помощью команды QUIT осуществляется выход в операционную систему (регистр символов тоже роли не играет).
Внимание! В случае выполнения аккуратного выхода из SQL*Plus по команде EXIT (или QUIT) будет немедленно происходить фиксация всех транзакций. Если не нужно, чтобы происходила фиксация транзакций, перед выходом потребуется выполнить команду rollback.
Использование SQL*Plus для написания и запуск кода PL/SQL в Oracle

Предок всех клиентских интерфейсов Oracle — приложение SQL*Plus — представляет собой интерпретатор для SQL и PL/SQL, работающий в режиме командной строки. Таким образом, приложение принимает от пользователя инструкции для доступа к базе данных, передает их серверу Oracle и отображает результаты на экране.
При всей примитивности пользовательского интерфейса SQL*Plus является одним из самых удобных средств выполнения кода SQL и PL/SQL в Oracle. Здесь нет замысловатых «примочек» и сложных меню, и лично мне это нравится. Когда я только начинал работать с Oracle (примерно в 1986 году), предшественник SQL*Plus гордо назывался UFI — User Friendly Interface (дружественный пользовательский интерфейс). И хотя в наши дни даже самая новая версия SQL*Plus вряд ли завоюет приз за дружественный интерфейс, она, по крайней мере, работает достаточно надежно.
В предыдущие годы компания Oracle предлагала версии приложения SQL*Plus с разными вариантами запуска:
- Консольная программа. Программа выполняется из оболочки или командной строки (окружения, которое иногда называют консолью)1.
- Программа с псевдографическим интерфейсом. Эта разновидность SQL*Plus доступна только в Microsoft Windows. Я называю этот интерфейс «псевдографическим», потому что он практически не отличается от интерфейса консольной программы, хотя и использует растровые шрифты. Учтите, что Oracle собирается свернуть поддержку данного продукта, и после выхода Oracle8i он фактически не обновлялся.
- Запуск через iSQL*Plus. Программа выполняется из браузера машины, на которой работает HTTP-сервер Oracle и сервер iSQL*Plus.
Начиная с Oracle11g, Oracle поставляет только консольную версию программы (sqlplus. exe).
Главное окно консольной версии SQL*Plus показано на рис. 1.

Рис. 1. Окно приложения SQL*Plus в консольном сеансе
Лично я предпочитаю консольную программу остальным по следующим причинам:
- она быстрее перерисовывает экран, что важно при выполнении запросов с большим объемом выходных данных;
Oracle называет это «версией SQL*Plus с интерфейсом командной строки», но мы полагаем, что это определение не однозначно, поскольку интерфейс командной строки предоставляют два из трех способов реализации SQL*Plus.
- у нее более полный журнал команд, вводившихся ранее в командной строке (по крайней мере на платформе Microsoft Windows);
- в ней проще менять такие визуальные характеристики, как шрифт, цвет текста и размер буфера прокрутки;
- она доступна практически на любой машине, на которой установлен сервер или клиентские средства Oracle.
Запуск SQL*Plus
Чтобы запустить консольную версию SQL*Plus, достаточно ввести команду sqlplus в приглашении операционной системы OS>:
OS> sqlplus
Этот способ работает как в операционных системах на базе Unix, так и в операционных системах Microsoft. SQL*Plus отображает начальную заставку, а затем запрашивает имя пользователя и пароль:
SQL*Plus: Release 11.1.0.6.0 - Production on Fri Nov 7 10:28:26 2008 Copyright (c) 1982, 2007, Oracle. All rights reserved. Enter user-name: bob Enter password: swordfish Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit SQL>
Если появится приглашение SQL>, значит, все было сделано правильно. (Пароль, в данном случае swordfish, на экране отображаться не будет.) Имя пользователя и пароль также можно указать в командной строке запуска SQL*Plus:
OS> sqlplus bob/swordfish
Однако так поступать не рекомендуется, потому что в некоторых операционных системах пользователи могут просматривать аргументы вашей командной строки, что позволит им воспользоваться вашей учетной записью. Ключ /NOLOG в многопользовательских системах позволяет запустить SQL*Plus без подключения к базе данных. Имя пользователя и пароль задаются в команде CONNECT:
OS> sqlplus /nolog SQL*Plus: Release 11.1.0.6.0 - Production on Fri Nov 7 10:28:26 2008 Copyright (c) 1982, 2007, Oracle. All rights reserved. SQL> CONNECT bob/swordfish SQL> Connected.
Если компьютер, на котором работает SQL*Plus, также содержит правильно сконфигурированное приложение Oracle Net1 и вы авторизованы администратором для подключения к удаленным базам данных (то есть серверам баз данных, работающим на других компьютерах), то сможете подключаться к ним из SQL*Plus. Для этого наряду с именем пользователя и паролем необходимо ввести идентификатор подключения Oracle Net, называемый также именем сервиса. Идентификатор подключения может выглядеть так:
hqhr.WORLD
Oracle Net — современное название продукта, который ранее назывался Net8 или SQL*Net.
Идентификатор вводится после имени пользователя и пароля, отделяясь от них символом «@»:
SQL> CONNECT bob/ SQL> Connected.
При запуске псевдографической версии SQL*Plus идентификационные данные вводятся в поле Host String (рис. 2.2). Если вы подключаетесь к серверу базы данных, работающему на локальной машине, оставьте поле пустым.

Рис. 2. Окно ввода идентификационных данных в SQL*Plus
После запуска SQL*Plus в программе можно делать следующее:
- выполнять SQL-инструкции;
- компилировать и сохранять программы на языке PL/SQL в базе данных;
- запускать программы на языке PL/SQL;
- выполнять команды SQL*Plus;
- запускать сценарии, содержащие сразу несколько перечисленных команд.
Рассмотрим поочередно каждую из перечисленных возможностей.
Выполнение SQL-инструкции
По умолчанию команды SQL в SQL*Plus завершаются символом «;» (точка с запятой), но вы можете сменить этот символ.
В консольной версии SQL*Plus запрос
SELECT isbn, author, title FROM books;
выдает результат, подобный тому, который показан на рис. 1.
Запуск программы на языке PL/SQL
Итак, приступаем. Введите в SQL*Plus небольшую программу на PL/SQL:
SQL> BEGIN 2 DBMS_OUTPUT.PUT_LINE('У меня получилось!'); 3 END; 4 /
После ее выполнения экран выглядит так:
PL/SQL procedure successfully completed. SQL>
Здесь я немного смухлевал: для получения результатов в таком виде нужно воспользоваться командами форматирования столбцов. Если бы эта книга была посвящена SQL*Plus или возможностям вывода данных, то я бы описал разнообразные средства управления выводом. Но вам придется поверить мне на слово: этих средств больше, чем вы можете себе представить.
Странно — наша программа должна была вызвать встроенную программу PL/SQL, которая выводит на экран заданный текст. Однако SQL*Plus по умолчанию почему-то подавляет такой вывод. Чтобы увидеть выводимую программой строку, необходимо выполнить специальную команду SQL*Plus — SERVEROUTPUT:
SQL> SET SERVEROUTPUT ON SQL> BEGIN 2 DBMS_OUTPUT.PUT_LINE('У меня получилось!'); 3 END; 4 /
И только теперь на экране появляется ожидаемая строка:
У меня получилось! PL/SQL procedure successfully completed. SQL>
Обычно я включаю команду SERVEROUTPUT в свой файл запуска (см. раздел «Автоматическая загрузка пользовательского окружения при запуске»). В таком случае она остается активной до тех пор, пока не произойдет одно из следующих событий:
- разрыв соединения, выход из системы или завершение сеанса с базой данных по иной причине;
- явное выполнение команды SERVEROUTPUT с атрибутом OFF;
- удаление состояния сеанса Oracle по вашему запросу или из-за ошибки компиляции;
- в версиях до Oracle9i Database Release 2 — ввод новой команды CONNECT. В последующих версиях SQL*Plus автоматически заново обрабатывает файл запуска после каждой команды CONNECT.
При вводе в консольном или псевдографическом приложении SQL*Plus команды SQL или PL/SQL программа назначает каждой строке, начиная со второй, порядковый номер. Нумерация строк используется по двум причинам: во-первых, она помогает вам определить, какую строку редактировать с помощью встроенного строкового редактора, а во-вторых, чтобы при обнаружении ошибки в вашем коде в сообщении об ошибке был указан номер строки. Вы еще не раз увидите эту возможность в действии. Ввод команд PL/SQL в SQL*Plus завершается символом косой черты (строка 4 в приведенном примере). Этот символ обычно безопасен, но у него есть несколько важных характеристик:
- Косая черта означает, что введенную команду следует выполнить независимо от того, была это команда SQL или PL/SQL.
- Косая черта — это команда SQL*Plus; она не является элементом языка SQL или PL/SQL.
- Она должна находиться в отдельной строке, не содержащей никаких других команд.
- В большинстве версий SQL*Plus до Oracle9i косая черта, перед которой стоял один или несколько пробелов, не работала! Начиная с Oracle9i, среда SQL*Plus правильно интерпретирует начальные пробелы, то есть попросту игнорирует их. Завершающие пробелы игнорируются во всех версиях.
Для удобства SQL*Plus предлагает пользователям PL/SQL применять команду EXECUTE, которая позволяет не вводить команды BEGIN, END и завершающую косую черту. Таким образом, следующая строка эквивалентна приведенной выше программе:
SQL> EXECUTE DBMS_OUTPUT.PUT_LINE('У меня получилось!')
Завершающая точка с запятой не обязательна, лично я предпочитаю ее опустить. Как и большинство других команд SQL*Plus, команду EXECUTE можно сократить, причем она не зависит от регистра символов. Поэтому указанную строку проще всего ввести так:
SQL> EXEC dbms_output.put_line('У меня получилось!')
Запуск сценария
Практически любую команду, которая может выполняться в интерактивном режиме SQL*Plus, можно сохранить в файле для повторного выполнения. Для выполнения сценария проще всего воспользоваться командой SQL*Plus @1. Например, следующая конструкция выполняет все команды в файле abc.pkg:
SQL> @abc.pkg
Файл сценария должен находиться в текущем каталоге (или быть указанным в переменной SQLPATH).
Если вы предпочитаете имена команд, используйте эквивалентную команду START:
SQL> START abc.pkg
и вы получите идентичные результаты. В любом случае команда заставляет SQL*Plus выполнить следующие операции:
- Открыть файл с именем abc.pkg.
- Последовательно выполнить все команды SQL, PL/SQL и SQL*Plus, содержащиеся в указанном файле.
- Закрыть файл и вернуть управление в приглашение SQL*Plus (если в файле нет команды EXIT, выполнение которой завершает работу SQL*Plus).
SQL> @abc.pkg Package created. Package body created. SQL>
По умолчанию SQL*Plus выводит на экран только результаты выполнения команд. Если вы хотите увидеть исходный код файла сценария, используйте команду SQL*Plus
SET ECHO ON.
В приведенном примере используется файл с расширением pkg. Если указать имя файла без расширения, произойдет следующее:
SQL> @abc SP2-0310: unable to open file "abc.sql"
Как видите, по умолчанию предполагается расширение sql. Здесь «SP2-0310» — код ошибки Oracle, а «SP2» означает, что ошибка относится к SQL*Plus. (За дополнительной информацией о сообщениях ошибок SQL*Plus обращайтесь к руководству Oracle «SQL*Plus User’s Guide and Reference».)
Команды START, @ и @@ доступны в небраузерной версии SQL *Plus. В iSQL*Plus для получения аналогичных результатов используются кнопки Browse и Load Script.

Что такое «текущий каталог»?
При запуске SQL*Plus из командной строки операционной системы SQL*Plus использует текущий каталог операционной системы в качестве своего текущего каталога. Иначе говоря, если запустить SQL*Plus командой
C:\BOB\FILES> sqlplus
все операции с файлами в SQL*Plus (такие, как открытие файла или запуск сценария) по умолчанию будут выполняться с файлами каталога C:\BOB\FILES. Если SQL*Plus запускается ярлыком или командой меню, то текущим каталогом будет каталог, который ассоциируется операционной системой с механизмом запуска. Как же сменить текущий каталог из SQL*Plus? Ответ зависит от версии. В консольной программе это просто невозможно: вы должны выйти из программы, изменить каталог средствами операционной системы и перезапустить SQL*Plus. В версии с графическим интерфейсом у команды меню FileOpen или FileSave имеется побочный эффект: она меняет текущий каталог. Если файл сценария находится в другом каталоге, то перед именем файла следует указать путь к нему:
SQL> @/files/src/release/1.0/abc.pkg
С запуском сценария из другого каталога связан интересный вопрос: что, если файл abc.pkg расположен в другом каталоге и, в свою очередь, запускает другие сценарии? Например, он может содержать такие строки:
REM имя файла: abc.pkg @abc.pks @abc.pkb
(Любая строка, начинающаяся с ключевого слова REM, является комментарием, и SQL*Plus ее игнорирует.) Предполагается, что сценарий abc.pkg будет вызывать сценарии abc.pks и abc.pkb. Но если информация о пути отсутствует, где же SQL*Plus будет их искать?
C:\BOB\FILES> sqlplus . SQL> @/files/src/release/1.0/abc.pkg SP2-0310: unable to open file "abc.pks" SP2-0310: unable to open file "abc.pkb"
Оказывается, поиск выполняется только в каталоге, из которого был запущен исходный сценарий. Для решения данной проблемы существует команда @@. Она означает, что в качестве текущего каталога должен временно рассматриваться каталог, в котором находится выполняемый файл. Таким образом, команды запуска в сценарии abc.pkg следует записывать так:
REM имя файла: abc.pkg @@abc.pks @@abc.pkb
Теперь результат выглядит иначе:
C:\BOB\FILES> sqlplus . SQL> @/files/src/release/1.0/abc.pkg Package created. Package body created.
. как, собственно, и было задумано.
Косая черта может использоваться в качестве разделителей каталогов как в Unix/Linux, так и в операционных системах Microsoft. Это упрощает перенос сценариев между операционными системами.
Другие задачи SQL*Plus
SQL*PLus поддерживает десятки команд, но мы остановимся лишь на некоторых из них, самых важных или особенно малопонятных для пользователя. Для более обстоятельного изучения продукта следует обратиться к книге Джонатана Генника Oracle SQL*Plus: The Definitive Guide (издательство O’Reilly), а за краткой справочной информацией — к книге Oracle SQL*Plus Pocket Reference того же автора.
Пользовательские установки
Многие аспекты поведения SQL*Plus могут быть изменены при помощи встроенных переменных и параметров. Один из примеров такого рода уже встречался нам при применении выражения SET SERVEROUTPUT. Команда SQL*Plus SET также позволяет задавать многие другие настройки. Так, выражение SET SUFFIX изменяет используемое по умолчанию расширение файла, а SET LINESIZE n — задает максимальное количество символов в строке (символы, не помещающиеся в строке, переносятся в следующую). Сводка всех SET-установок текущего сеанса выводится командой
SQL> SHOW ALL
Приложение SQL*Plus также позволяет создавать собственные переменные в памяти и задавать специальные переменные, посредством которых можно управлять его настройками. Переменные SQL*Plus делятся на два вида: DEFINE и переменные привязки. Значение DEFINE-переменной задается командой DEFINE:
SQL> DEFINE x = "ответ 42"
Чтобы просмотреть значение x, введите следующую команду:
SQL> DEFINE x DEFINE X = "ответ 42" (CHAR)
Ссылка на данную переменную обозначается символом &. Перед передачей инструкции Oracle SQL*Plus выполняет простую подстановку, поэтому если значение переменной должно использоваться как строковый литерал, ссылку следует заключить в кавычки:
SELECT '&x' FROM DUAL;
Переменная привязки объявляется командой VARIABLE. В дальнейшем ее можно будет использовать в PL/SQL и вывести значение на экран командой SQL*Plus PRINT:
SQL> VARIABLE x VARCHAR2(10) SQL> BEGIN 2 :x := 'hullo'; 3 END; 4 / PL/SQL procedure successfully completed. SQL> PRINT :x X -------------------------------- hullo
Ситуация немного запутывается, потому что у нас теперь две разные переменные x: одна определяется командой DEFINE, а другая — командой VARIABLE:
SQL> SELECT :x, '&x' FROM DUAL; old 1: SELECT :x, '&x' FROM DUAL new 1: SELECT :x, 'ответ 42' FROM DUAL :X 'ОТВЕТ42' -------------------------------- ---------------- hullo ответ 42
Запомните, что DEFINE-переменные всегда представляют собой символьные строки, которые SQL*Plus заменяет их текущими значениями, а VARIABLE-переменные используются в SQL и PL/SQL как настоящие переменные привязки.
Сохранение результатов в файле
Выходные данные сеанса SQL*Plus часто требуется сохранить в файле — например, если вы строите отчет, или хотите сохранить сводку своих действий на будущее, или динамически генерируете команды для последующего выполнения. Все эти задачи легко решаются в SQL*Plus командой SPOOL:
SQL> SPOOL report SQL> @run_report . выходные данные выводятся на экран и записываются в файл report.lst. SQL> SPOOL OFF
Первая команда SPOOL сообщает SQL*Plus, что все строки данных, выводимые после нее, должны сохраняться в файле report.lst. Расширение lst используется по умолчанию, но вы можете переопределить его, указывая нужное расширение в команде SPOOL:
SQL> SPOOL report.txt
Вторая команда SPOOL приказывает SQL*Plus прекратить сохранение результатов и закрыть файл.
Выход из SQL*Plus
Чтобы выйти из SQL*Plus и вернуться в операционную систему, выполните команду EXIT:
SQL> EXIT
Если в момент выхода из приложения данные записывались в файл, SQL*Plus прекращает запись и закрывает файл.
А что произойдет, если в ходе сеанса вы внесли изменения в данные некоторых таблиц, а затем вышли из SQL*Plus без явного завершения транзакции? По умолчанию SQL*Plus принудительно закрепляет незавершенные транзакции, если только сеанс не завершился с ошибкой SQL или если вы не выполнили команду SQL*Plus WHENEVER SQLERROR EXIT ROLLBACK (см. далее раздел «Обработка ошибок в SQL*Plus»).
Чтобы разорвать подключение к базе данных, но остаться в SQL*Plus, следует выполнить команду CONNECT. Результат ее выполнения выглядит примерно так:
SQL> DISCONNECT Disconnected from Personal Oracle Database 10g Release 10.1.0.3.0 - Production With the Partitioning, OLAP and Data Mining options SQL>
Для смены подключений команда DISCONNECT не обязательна — достаточно ввести команду CONNECT, и SQL*Plus автоматически разорвет первое подключение перед созданием второго. Тем не менее команда DISCONNECT вовсе не лишняя — при использовании средств аутентификации операционной системы сценарий может автоматически восстановить подключение. к чужой учетной записи. Я видел подобные примеры.
Редактирование инструкции
SQL*Plus хранит последнюю выполненную инструкцию в буфере. Содержимое буфера можно отредактировать во встроенном редакторе либо в любом внешнем редакторе по вашему выбору. Начнем с процесса настройки и использования внешнего редактора.
Аутентификация операционной системы позволяет запускать SQL*Plus без ввода имени пользователя и пароля.
Команда EDIT сохраняет буфер в файле, временно приостанавливает выполнение SQL*Plus и передает управление редактору:
SQL> EDIT
По умолчанию файл будет сохранен под именем afiedt.buf, но вместо этого имени можно выбрать другое (команда SET EDITFILE). Если же вы хотите отредактировать существующий файл, укажите его имя в качестве аргумента EDIT:
SQL> EDIT abc.pkg
После сохранения файла и выхода из редактора сеанс SQL*Plus читает содержимое отредактированного файла в буфер, а затем продолжает работу.
По умолчанию Oracle использует следующие внешние редакторы:
- ed в Unix, Linux и других системах этого семейства;
- Блокнот в системах Microsoft Windows.
Хотя выбор редактора по умолчанию жестко запрограммирован в исполняемом файле sqlplus, его легко изменить, присвоив переменной_EDITOR другое значение. Например, я часто использую следующую команду:
SQL> DEFINE _EDITOR = /bin/vi
Здесь /bin/vi — полный путь к редактору, хорошо известному в среде «технарей». Я рекомендую задавать полный путь к редактору по соображениям безопасности.
Если же вы хотите работать со встроенным строковым редактором SQL*Plus (иногда это в самом деле бывает удобно), вам необходимо знать следующие команды:
- L — вывод последней команды.
- n — сделать текущей строкой n-ю строку команды.
- DEL — удалить текущую строку.
- C /old/new/ — заменить первое вхождение old в текущей строке на new (разделителем может быть произвольный символ, в данном случае это косая черта).
- n text — сделать text текущим текстом строки n.
- I — вставить строку после текущей. Чтобы вставить новую строку перед первой, используйте команду с нулевым номером строки (например, 0 text).
Автоматическая загрузка пользовательского окружения при запуске
Для настройки среды разработки SQL*Plus можно изменять один или оба сценария ее запуска. SQL*Plus при запуске выполняет две основные операции:
- ищет в корневом каталоге Oracle файл sqlplus/admin/glogin.sql и выполняет содержащиеся в нем команды (этот «глобальный» сценарий реализуется независимо от того, кто запустил SQL*Plus из корневого каталога Oracle и какой каталог был при этом текущим);
- находит и выполняет файл login.sql в текущем каталоге, если он существует. Начальный сценарий может содержать те же типы команд, что и любой другой сценарий SQL*Plus: команды SET, SQL-инструкции, команды форматирования столбцов и т. д.
Ни один из файлов не является обязательным. Если присутствуют оба файла, то сначала выполняется glogin.sql, а затем login.sql; в случае конфликта настроек или переменных преимущество получают установки последнего файла, login.sql.
А если не существует, но переменная SQLPATH содержит один или несколько каталогов, разделенных двоеточиями, SQL*Plus просматривает эти каталоги и выполняет первый обнаруженный файл login.sql.
Несколько полезных установок в файле login.sql:
REM Количество строк выходных данных инструкции SELECT REM перед повторным выводом заголовков SET PAGESIZE 999 REM Ширина выводимой строки в символах SET LINESIZE 132 REM Включение вывода сообщений DBMS_OUTPUT. REM В версиях, предшествующих Oracle Database 10g Release 2, REM вместо UNLIMITED следует использовать значение 1000000. SET SERVEROUTPUT ON SIZE UNLIMITED FORMAT WRAPPED REM Замена внешнего текстового редактора DEFINE _EDITOR = /usr/local/bin/vim REM Форматирование столбцов, извлекаемых из словаря данных COLUMN segment_name FORMAT A30 WORD_WRAP COLUMN object_name FORMAT A30 WORD_WRAP REM Настройка приглашения (работает в SQL*Plus Oracle9i и выше) SET SQLPROMPT "_USER'@'_CONNECT_IDENTIFIER > "
Обработка ошибок в SQL*Plus
Способ, которым SQL*Plus информирует вас об успешном завершении операции, зависит от класса выполняемой команды. Для большинства команд SQL*Plus признаком успеха является отсутствие сообщений об ошибках. С другой стороны, успешное выполнение инструкций SQL и PL/SQL обычно сопровождается выдачей какой-либо текстовой информации.
Если ошибка содержится в команде SQL или PL/SQL, SQL*Plus по умолчанию сообщает о ней и продолжает работу. Это удобно в интерактивном режиме, но при выполнении сценария желательно, чтобы при возникновении ошибки работа SQL*Plus прерывалась. Для этого применяется команда
SQL> WHENEVER SQLERROR EXIT SQL.SQLCODE
SQL*Plus прекратит работу, если после выполнения команды сервер базы данных в ответ на команду SQL или PL/SQL вернет сообщение об ошибке. Часть приведенной выше команды, SQL.SQLCODE, означает, что при завершении работы SQL*Plus установит ненулевой код завершения, значение которого можно проверить на стороне вызова. В противном случае SQL*Plus всегда завершается с кодом 0, что может быть неверно истолковано как успешное выполнение сценария. Другая форма указанной команды:
SQL> WHENEVER SQLERROR SQL.SQLCODE EXIT ROLLBACK
означает, что перед завершением SQL*Plus будет произведен откат всех несохраненных изменений данных.
Достоинства и недостатки SQL*Plus
Кроме тех, что указаны выше, у SQL*Plus имеется несколько дополнительных функций, которые вам наверняка пригодятся.
- С помощью SQL*Plus можно запускать пакетные программы, задавая в командной строке аргументы и обращаясь к ним по ссылкам вида &1 (первый аргумент), &2 (второй аргумент) и т. д.
Например, с помощью системной переменной $? в Unix и %ERRORLEVEL% в Microsoft Windows.
- SQL*Plus обеспечивает полную поддержку всех команд SQL и PL/SQL. Это обычно имеет значение при использовании специфических возможностей Oracle. В средах сторонних разработчиков отдельные элементы указанных языков могут поддерживаться не в полном объеме. Например, некоторые из них до сих пор не поддерживают объектные типы Oracle, введенные несколько лет назад.
- SQL*Plus работает на том же оборудовании и в тех же операционных системах, что и сервер Oracle.
Как и любые другие инструментальные средства, SQL*Plus имеет свои недостатки:
- В консольных версиях SQL*Plus буфер команд содержит только последнюю из ранее использовавшихся команд. Журнала команд эта программа не ведет.
- SQL*Plus не имеет таких возможностей, характерных для современных интерпретаторов команд, как автоматическое завершение ключевых слов и подсказки о доступных объектах базы данных, появляющиеся при вводе команд.
- Электронная справка содержит минимальную информацию о наборе команд SQL*Plus. (Для получения справки по конкретной команде используется команда HELP.)
- После запуска SQL*Plus сменить текущий каталог невозможно, что довольно неудобно, если вы часто открываете и сохраняете сценарии и при этом не хотите постоянно указывать полный путь к файлу. Если вы обнаружили, что находитесь не в том каталоге, вам придется выйти из SQL*Plus, сменить каталог и снова запустить программу.
- Если не использовать механизм SQLPATH, который я считаю потенциально опасным, SQL*Plus ищет файл login.sql только в каталоге запуска; было бы лучше, если бы программа продолжала поиск файла в домашнем каталоге стартового сценария.
Итак, SQL*Plus не отличается удобством в работе и изысканностью интерфейса. Но данное приложение используется повсеместно, работает надежно и наверняка будет поддерживаться до тех пор, пока существует Oracle Corporation.
Инсталляция Oracle Instant Client 11.2 в Oracle Linux
Если не работает вышеуказанный сайт, исходники можно взять здесь:
https://github.com/hanslub42/rlwrap
# tar zxvf rlwrap-0.37.tar.gz # cd rlwrap-0.37 # ./configure
# make && make check && make install
Если с sqlplus будет работать один конкретный пользователь. Данные записи следует добавить в его профиль.
# su - oracle11
$ vi ~/.bash_profile
################################# ## Oracle Instant Client export SQLPATH=/u01/app/oracle/instantclient/11.2 export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TNS_ADMIN=$ export LD_LIBRARY_PATH=$ export PATH=$:$ alias sqlplus='rlwrap sqlplus' alias rman='rlwrap rman' #################################
$ source ~/.bash_profile
# sqlplus /nolog
SQL> conn system/system@oracle112:1521/ora112.localdomain Connected.
Создание файла (tnsnames.ora) с параметрами подключения к базе данных
# vi /u01/app/oracle/instantclient/11.2/tnsnames.ora
oracle11 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle112.localdomain)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ora112.localdomain) ) )
oracle112.localdomain — запись в DNS или HOSTS
# sqlplus /nolog
SQL> conn system/system@oracle11 Connected.
Tags: Oracle Database, Oracle Client, Инсталляция, Linux
|
|
|
Oracle DBA
Собираем также материалы по: SQL & PL/SQL
Лучше потратить какое-то количество времени, чтобы записать успешный опыт, чем потом повторно воспроизводить его по памяти.
Все материалы обновляются по мере нахождения лучших практик и апгрейда знаний. Если будут желающие добавлять свои знания или исправлять ошибки и неточности, пишите в телеграм чате. Если будет учавствовать больше людей, качество материалов будет улучшаться и обновляться быстрее. Ссылки на ваши профили в соц. сетях будут добавлены в статьях, в которых вы учавствуете.
