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 завершил работу после его выполнения.