Pages

Thursday, July 4, 2019

SQLPlus command history

К сожалению, в UNIX подобных системах отсутствует возможность использовать стрелки (вверх/вниз) для того чтобы просмотреть и снова прогнать команды/запросы выполненные до этого в SQLPlus. Поскольку в свое работе я пользуюсь в основном именно этой утилитой (из IDE предпочитаю Toad), то было бы неплохо иметь такую возможность.
Есть зарегистрированный баг:




Исходя из информации выше, по дефоту, данный функционал доступен с версии 12.2.0.1.0.

Однако, большая часть моих клиентов использует либо 11.2.0.4, либо 12.1.0.2.

Вот, что предлагает Oracle (567215.1):

According to enhancement request, there is no workaround possible for the same functionality.
However, you may want to access the previous command(s) by specifying a spool file and then copy-paste from the spool file, in case you want to run an earlier command.

Another option is to use SQL*Plus on a Windows platform, if one is available to you.

You may also want to try the "rlwrap" program; however, this is not supported by Oracle.

Два первых варианта мне совершенно не подходят. Ну что ж, попробуем использовать пакет "rlwrap", несмотря на то, что он не поддерживается самим Ораклом, по каким-то причинам.

1) Скачиваем пакет rpm или исходники (я предпочел скачать готовый rpm):

RedHat EL 5 --- http://rpm.pbone.net/index.php3/stat/4/idpl/45322991/dir/redhat_el_5/com/rlwrap-0.42-1.el5.x86_64.rpm.html

RedHat EL 6 --- https://download-ib01.fedoraproject.org/pub/epel/6/x86_64/Packages/r/rlwrap-0.42-1.el6.x86_64.rpm

2) Устанавливаем:

[root@cloud1 rlwrap]# rpm -Uvh rlwrap-0.42-1.el6.x86_64.rpm
warning: rlwrap-0.42-1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing...                ########################################### [100%]
   1:rlwrap                 ########################################### [100%]
[root@cloud1 rlwrap]# which rlwrap
/usr/bin/rlwrap

3) Тестируем:

cdb1> oracle@cloud1 [03:26:56] ~]$ rlwrap sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Thu Jul 4 03:26:57 2019

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> select instance_name, status from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
cdb1             OPEN

SQL> select database_role, open_mode from v$database;

DATABASE_ROLE    OPEN_MODE
---------------- --------------------
PRIMARY          READ WRITE

SQL> select instance_name, status from v$instance; <= Здесь использовал стрелочку вверх, чтобы вернуться в первому селекту

INSTANCE_NAME    STATUS
---------------- ------------
cdb1             OPEN


4) Добавляем алиасы в файл окружения:

Помимо sqlplus, rlwrap можно использовать и с другими оракловыми утилитами (rman, expdp, impdp etc).

cdb1> oracle@cloud1 [03:32:20] ~]$ cat *env

....
...
##
## Tools
##

alias sqlplus="rlwrap sqlplus"
alias dgmgrl="rlwrap dgmgrl"
alias rman="rlwrap rman"
alias lsnrctl="rlwrap lsnrctl"
alias asmcmd="rlwrap asmcmd"
alias adrci="rlwrap adrci"
alias impdp="rlwrap impdp"
alias expdp="rlwrap expdp"

5) [OPTIONAL] Корректировка .bash_profile:

Для того чтобы совсем облегчить себе жизнь, можно прописать все необходимое в файле .bash_profile пользователя "oracle" (в моем случае), чтобы каждый раз не выставляять алиасы и не прописывать переменные окружения. Пример:

cdb1> oracle@cloud1 [03:39:37] ~]$ cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

export ORACLE_SID=cdb1
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.1.0.2/db_1
export ORACLE_HOSTNAME=cloud1.database.com
export TMP=/tmp
export TMPDIR=$TMP
export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export PS1='\[\033[0;32m\]$ORACLE_SID> \[\033[0;33m\]\u@\h\[\033[00m\] [\t] \w]\$ '
export OMS_HOME=/u01/app/oracle/middleware
export AGENT_HOME=/u01/app/oracle/agent/agent_inst
##
## Tools
##
alias sqlplus="rlwrap ${ORACLE_HOME}/bin/sqlplus"
alias dgmgrl="rlwrap ${ORACLE_HOME}/bin/dgmgrl"
alias rman="rlwrap ${ORACLE_HOME}/bin/rman"
alias lsnrctl="rlwrap ${ORACLE_HOME}/bin/lsnrctl"
alias asmcmd="rlwrap ${ORACLE_HOME}/bin/asmcmd"
alias adrci="rlwrap ${ORACLE_HOME}/bin/adrci"
alias impdp="rlwrap ${ORACLE_HOME}/bin/impdp"
alias expdp="rlwrap ${ORACLE_HOME}/bin/expdp"

6) [OPTIONAL] Отдельная функция в .bash_profile:

Чтобы каждый раз не писать, например, sqlplus / as sysdba можно определить функцию ниже все в том же файле .bash_profile и просто использовать sp:

cat .bash_profile:

...
...
...
sp () {
  sqlplus / as sysdba
}

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

alias sp="rlwrap ${ORACLE_HOME}/bin/sqlplus / as sysdba"

7) История:

Вся история команд будет находиться в файле:

cdb1> oracle@cloud1 [03:53:33] ~]$ ls -la /home/oracle/.sqlplus_history
-rw-------. 1 oracle oinstall 503 Jul  4 03:51 /home/oracle/.sqlplus_history

Источники:

Arrow Key Does Not Show Command History When Using SQL*Plus (Doc ID 567215.1)
Bug 4598315 ENH: ADD A COMMAND LINE HISTORY TO SQL*PLUS
SQL*Plus command line history completion (Doc ID 460591.1)
https://blogs.oracle.com/ebrambilla/sqlplus-command-history-on-linux