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側で出力結果を制限していることがわかります。
マニュアルは こちら です。
出力数を超えている場合には「(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を指定すると、出力幅を自動的に計算してくれるようになります。
マニュアルは こちら です。
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>