Есть зарегистрированный баг:
Исходя из информации выше, по дефоту, данный функционал доступен с версии 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"
Чтобы каждый раз не писать, например, 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