Янв 152014
 

С точки зрения usability незаменимая утилита SQL*Plus представляет собой насилие над пользователем, и к использованию человеком, хоть раз увидившим нормальный софт, написанный с использованием библиотеки readline, совершенно непригодна.
К счастью, существует великолепная утилита rlwrap. Она создаёт обёртку из readline для SQL*Plus, что позволяет нормально редактировать команды, искать по истории команд, и даже использовать автодополнение!
Просто установить rlwrap мало, его надо правильно приготовить. Об этом и будет статья.

Готовим rlwrap для SQL*Plus.

  1. Установим rlwrap. Использовать метод configure-make-install моветон, поэтому надо поставить пакет. Этот шаг зависит от дистрибутива Linux (а может, и не Linux), с которым вы работаете.
  2. Скачиваем архив с файлами автодополнений для нужной нам версии СУБД тут и распаковываем его в /usr/local/share/rlwrap/completions. В этих файлах содержатся ключевые слова, представления V$* и DBA*, все параметры инициализации, пакеты DBMS* и всё остальное, что будет автоматически дополняться по нажатию клавиши TAB.
  3. В .profile (или где у вас лежит профиль пользователя) пишем:

    alias sqlplus=/usr/local/share/rlwrap/completions/sql+
  4. Это опциональный шаг. Есть такой файлик $ORACLE_HOME/sqlplus/admin/glogin.sql, он запускается автоматически каждый раз при запуске SQL*Plus. Мне удобно, чтобы в строке приглашения было имя пользователя и базы и ещё кое-какое форматирование. Тут на вкус и цвет, как говорится.
    Пишем туда:

    COLUMN ROWLABEL format A15
    COLUMN LINE/COL format A8
    COLUMN ERROR    format A65  WORD_WRAPPED
    COLUMN HIGH_VALUE format A100
     
    COLUMN id_plus_exp format 990 heading i
    COLUMN parent_id_plus_exp format 990 heading p
    COLUMN plan_plus_exp format a80
    COLUMN object_node_plus_exp format a8
    COLUMN other_tag_plus_exp format a29
    COLUMN other_plus_exp format a44
     
    SET pagesize 40
    SET linesize 140
    SET trimspool ON
    SET longchunksize 200
    SET LONG 32000
    SET longchunksize 2000
    SET wrap off
    SET term off
    SET arraysize 1
    SET TIMING ON
     
    COLUMN VALUE new_value db_bsize
    SELECT VALUE FROM v$parameter WHERE name='db_block_size';
    COLUMN VALUE clear
    SET pause "Press Enter key ..."
    SET term ON
    SET verify off
    SET serveroutput ON SIZE 1000000
     
    -- Set prompt DB_NAME_USER
    SET term off
    COLUMN VALUE new_value my_dbname
    COLUMN USER new_value my_name
    SELECT USER FROM dual;
    SELECT SUBSTR(global_name,1,DECODE(INSTR(global_name,'.'), 0,40,
                                       INSTR(global_name,'.')-1
                                      )
                 ) VALUE FROM global_name;
    COLUMN VALUE clear
    COLUMN USER clear
    SET sqlprompt "&my_dbname._&my_name> "
    SET term ON
    SET wrap ON
    ALTER SESSION SET nls_date_format = 'DD-Mon-YYYY  HH24:MI:SS';

Всё, наслаждаемся!

Пара замечаний

По мнению многих администраторов, использовать alias неправильно, т.к. rlwrap может сделать (и таки сделает) непредсказуемым поведение SQL*Plus в скриптах. Будучи полностью согласен с этим мнением, я не переопределяю sqlplus на серверах с БД, а использую для управления выделенную виртуалку с Линуксом, где и проделал все эти настройки.
Кроме того, в файле истории будут сохраняться пароли доступа к базам. Это не есть хорошо, поэтому пароли надо вводить в интерактивном режиме.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)