Oracle Database 12c Release 2に付属するSQL*Plusの新機能を試してみました。
HISTORY
SQL*Plus待望のコマンド実行履歴の管理機能です。残念ながらSQLclのような矢印キーによる履歴操作はできません。
初期設定
履歴管理機能はデフォルトではOFFになっているのでSET HISTORY ONコマンドで有効にします。ONの代りに数字を指定すると、履歴保存数を指定できます。デフォルト値は100です。
SQL> SHOW HISTORY
history is OFF
SQL>
SQL> SET HISTORY ON
SQL> SHOW HISTORY
historyはONであり、設定先は "100"です。
SQL>
SQL> SET HISTORY 200
SQL> SHOW HISTORY
historyはONであり、設定先は "200"です。
SQL>
履歴の管理
実行履歴を表示するにはHISTORYコマンド(またはHISTORY LISTコマンド)を実行します。履歴はSQL文の成功/失敗にかかわらず保存されますが、HISTORYコマンド自身は履歴に入りません。HISTORYコマンドはHISTと省略できます。
SQL> HISTORY
1 SELECT * FROM scott.emp;
2 SELECT SYSDATE FROM DUAL;
3 SELECT 1;
過去に実行したコマンドをもう一度実行するにはHISTORY 番号 RUNコマンドを実行します。HISTORYコマンドを再実行すると、最後に実行したコマンド先頭にアスタリスクが表示されます。
SQL> HISTORY
1 SELECT * FROM scott.emp;
2 SELECT SYSDATE FROM DUAL;
3 SELECT 1;
SQL> HIST 2 RUN
SYSDATE
--------
18-05-21
SQL> HISTORY
1 SELECT * FROM scott.emp;
* 2 SELECT SYSDATE FROM DUAL;
3 SELECT 1;
履歴を修正するにはHISTORY 番号 EDITコマンドを実行します。エディタはDEFINE _EDITORコマンドで指定できます。Linux環境のデフォルト値はviです。HISTORY EDITコマンドで修正したSQL文はHISTORYの最後に追加されます。
SQL> HISTORY 2 EDIT
-- エディタ起動 --
SQL> HISTORY
1 SELECT * FROM scott.emp;
2 SELECT SYSDATE FROM DUAL;
3 SELECT 1;
4 SELECT SYSDATE TODAY FROM DUAL; <- 追加された
履歴全体を削除するにはHISTORY CLEARコマンドを実行します。一部だけ削除するにはHISTORY 番号 DELETEコマンドを実行します。
新規追加されたパラメータ
パフォーマンスを向上させるためのSQL*Plusパラメータが追加されました。SETコマンドで設定します。
パラメータ | デフォルト値 | 説明 | 備考 |
---|---|---|---|
LOBPREFETCH | 0 | プリフェッチされるLOBデータ量をバイト数で指定 | 最大値は2GB |
ROWPREFETCH | 1 | プリフェッチされるレコード数を指定 | データ量の最大バイト数は2GB |
STATEMENTCACHE | 0 | 文キャッシュ・サイズを指定 | STATEMENTCに省略可能 |
上記の通り、追加されたパラメータはデフォルトでは使用されません。個別に指定しても良いのですが、SQL*Plusの-Fオプションをしていすると一括でパラメータを増加させることができます。
-Fオプションで変更されるのは上記に加えてARRAYSIZEとPAGESIZEです。
$ sqlplus / as sysdba
SQL> SHOW ARRAYSIZE
arraysize 15
SQL> SHOW PAGESIZE
pagesize 14
SQL> SHOW LOBPREFETCH
lobprefetch 0
SQL> SHOW ROWPREFETCH
rowprefetch 1
SQL> SHOW STATEMENTCACHE
statementcache is 0
SQL>
$ sqlplus -F / as sysdba
SQL> SHOW ARRAYSIZE
arraysize 100
SQL> SHOW PAGESIZE
pagesize 50000
SQL> SHOW LOBPREFETCH
lobprefetch 16384
SQL> SHOW ROWPREFETCH
rowprefetch 2
SQL> SHOW STATEMENTCACHE
statementcache is 20
SQL>
CSV出力
SELECT文の実行結果をCSV形式で出力できるようになりました。SET MARKUP CSV ONコマンドを実行します。SQL*Plus起動オプション -M "CSV ON"を指定するとデフォルト状態でCSV化できます。デリミタとしてカンマが指定され、文字列型はダブル・クオーテーションで囲まれます。文字データ内にダブル・クオーテーションが含まれる場合は、ダブル・クオーテーションが2重になります。
SQL> SET MARKUP CSV ON
SQL> SELECT * FROM emp;
"EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO"
7369,"SMITH","CLERK",7902,"80-12-17",800,,20
7499,"ALLEN","SALESMAN",7698,"81-02-20",1600,300,30
SQL>
デリミタを変更する場合はSET MARKUP CSV ON DELIMITER '区切り文字'コマンドを実行します。囲み文字にタブを指定してもスペースに変換されます。
SQL> SET MARKUP CSV ON DELIMITER ';'
SQL> SELECT * FROM emp;
"EMPNO";"ENAME";"JOB";"MGR";"HIREDATE";"SAL";"COMM";"DEPTNO"
7369;"SMITH";"CLERK";7902;"80-12-17";800;;20
7499;"ALLEN";"SALESMAN";7698;"81-02-20";1600;300;30
SQL>
囲み文字を指定しない場合は、SET MARKUP CSV ON QUOTE OFFコマンドを実行します。DELIMITERとQUOTEを両方指定することもできます。
SQL> SET MARKUP CSV ON QUOTE OFF
SQL> SELECT * FROM scott.emp;
EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO
7369,SMITH,CLERK,7902,80-12-17,800,,20
7499,ALLEN,SALESMAN,7698,81-02-20,1600,300,30
VARIABLE
バインド変数の宣言時に初期値を指定できるようになりました。
構文は「VARIABLE 変数名 [データ型 [=初期値]]」です。
SQL> VARIABLE tmp_val NUMBER = 100
SQL> PRINT tmp_val
TMP_VAL
----------
100
SQL>
FEEDBACK
SET FEEDBACK ONLY文を実行すると、検索レコード数のみが出力されるようになります。
SQL> SET FEEDBACK ONLY
SQL> SELECT * FROM DBA_OBJECTS;
23002行が選択されました。
SQL>