SQL*Plusの新機能を試す (Oracle Database 12c Release 2)


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化できます。デリミタとしてカンマが指定され、文字列型はダブル・クオーテーションで囲まれます。文字データ内にダブル・クオーテーションが含まれる場合は、ダブル・クオーテーションが２重になります。

```
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>
```