LoginSignup
5
1

More than 3 years have passed since last update.

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

Posted at

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>
5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1