SQL*Plusの新機能を試す (Oracle Database 18c)

Oracle Database 18cでSQL*Plusにいくつかの新機能が追加されましたので検証します。

# SET FEEDBACK ON SQL_ID

SET FEEDBACK ONコマンドにSQL_IDオプションを指定すると実行したSQL文のSQL_IDが自動的に出力されるようになりました。DBMS_XPLANパッケージ等、SQL_IDを必要とするパッケージの実行時に便利です。

```
SQL> SET FEEDBACK ON SQL_ID
SQL>
SQL> SELECT COUNT(*) FROM large1;

  COUNT(*)
----------
   1000002

1 row selected.

SQL_ID: 71r7vkd8nfzh8
SQL>
```

# SET ROWLIMIT n

SET ROWLIMIT コマンドに数字を指定すると、SQL文実行結果の最大出力行数を制限できます。
指定できる値は1から2000000000の値の整数です。この指定を行った場合の実行計画を確認しても変化が無いため、SQL文自体は変更せずにSQL*Plus側で出力結果を制限していることがわかります。
マニュアルは [こちら](https://docs.oracle.com/cd/E96517_01/sqpug/SET-system-variable-summary.html#GUID-91B3F7F0-2586-403D-A74A-212480560E38) です。

出力数を超えている場合には「(rowlimit reached)」のメッセージが出力されます。


```
SQL> SET ROWLIMIT 10
SQL> SELECT * FROM large1;

        C1 C2
---------- ----------
         1 data1
         2 data1
         3 data1
         4 data1
         5 data1
         6 data1
         7 data1
         8 data1
         9 data1
        10 data1

10 rows selected. (rowlimit reached)

SQL> 
SQL> SET ROWLIMIT 2000000000
SQL> SELECT * FROM TABLE(dbms_xplan.display_cursor(sql_id=>'2jzsnxbfdkghw'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  2jzsnxbfdkghw, child number 0
-------------------------------------
SELECT * FROM large1

Plan hash value: 2439585055

----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        |       |       |   619 (100)|          |
|   1 |  TABLE ACCESS FULL| LARGE1 |  1000K|    10M|   619   (1)| 00:00:01 |

13 rows selected.

```
SET ROWLIMITコマンドで数字を指定した場合、SET FEEDBACK OFFの状態でもレコード行数が出力されます（SET FEEDBACK ONと同じ）。

```
SQL> SET FEEDBACK OFF
SQL> SET ROWLIMIT 1
SQL> SELECT COUNT(*) FROM large1;

  COUNT(*)
----------
   1000002

1 row selected. (rowlimit reached)

SQL> SET ROWLIMIT 2
SQL> SELECT COUNT(*) FROM large1;

  COUNT(*)
----------
   1000002

1 row selected.

SQL>
```

# SET LINESIZE WINDOW

SET LINESIZEコマンドにWINDOWを指定すると、出力幅を自動的に計算してくれるようになります。
マニュアルは [こちら](https://docs.oracle.com/cd/E96517_01/sqpug/SET-system-variable-summary.html#GUID-6C9EC78E-F27C-4588-A400-FE8732871B40) です。

```
SQL> CREATE TABLE line1(c1 CHAR(20), c2 VARCHAR2(20));

Table created.

SQL> INSERT INTO line1 VALUES ('ABC', 'DEF');

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SET LINESIZE 10
SQL> SELECT * FROM line1;

C1
----------
C2
----------
ABC

DEF


1 row selected.

SQL> SET LINESIZE WINDOW
SQL> SELECT * FROM line1;

C1                   C2
-------------------- --------------------
ABC                  DEF

1 row selected.
```

# SQLclでは？
Oracle Database 18c のSQLcl でも試してみましたが、こちらには実装されていないようです。
SET FEEDBACK ON SQL_IDコマンドはエラーにはなりませんが、実行結果にSQL_IDは出力されません。
SET ROWLIMITコマンドとSET LINESIZE WINDOWコマンドは実行エラーになります。


```
SQL> SET FEEDBACK ON SQL_ID
SQL> SELECT COUNT(*) FROM large1;

  COUNT(*)
----------
   1000002

1 row selected.

SQL> SET LINESIZE WINDOW
SP2-0268: linesize option not a valid number
SQL>
SQL> SET ROWLIMIT 10
SP2-0158: unknown SET option "rowlimit"
SQL>
```