SQL*PlusのLINESIZEとSERVEROUTPUT

PL/SQLプログラムから、端末に文字列を出力するにはDBMS_OUTPUTパッケージを使います。
SQL*PlusからDBMS_OUTPUTパッケージを使って画面に出力する際にはあらかじめSET SERVEROUTPUT ONを実行する必要があります。

```
SQL> SET SERVEROUTPUT ON
SQL> BEGIN
  2      DBMS_OUTPUT.PUT_LINE('Hello world!');
  3  END;
  4  /
Hello world!

PL/SQLプロシージャが正常に完了しました。
```

DBMS_OUTPUT.PUT_LINEは指定された文字列に加えて改行コードを出力します。
SQL*Plusでは一行に書き込みできる桁数はLINESIZE設定で指定しますが、文字列の末端がスペースかどうかで動作が異なるようです。
下記の例はLINESIZE設定が80バイトの時に、82バイトの出力を行っています。行末の処理が変化しています。

```
SQL> SHOW LINESIZE
linesize 80
SQL> BEGIN
  2     DBMS_OUTPUT.PUT_LINE('0        1         2         3         4         5         6         7         8  ');
  3     DBMS_OUTPUT.PUT_LINE('12345678901234567890123456789012345678901234567890123456789012345678901234567890  ');
  4     DBMS_OUTPUT.PUT_LINE('0        1         2         3         4         5         6         7         8AB');
  5     DBMS_OUTPUT.PUT_LINE('12345678901234567890123456789012345678901234567890123456789012345678901234567890AB');
  6  END;
  7  /
0        1         2         3         4         5         6         7         8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
0        1         2         3         4         5         6         7
8AB
12345678901234567890123456789012345678901234567890123456789012345678901234567890
AB

PL/SQLプロシージャが正常に完了しました。
```

上記動作はSET SERVEROUTPUTのオプションによって変化します。
SET SERVEROUTPUTのFORMATオプションで変化します。デフォルトはWORD_WRAPPEDで単語単位に改行します。WRAPPEDを指定すると単純にバイト単位で改行を行います。

```
SQL> SET SERVEROUTPUT ON FORMAT WRAPPED
SQL> BEGIN
  2     DBMS_OUTPUT.PUT_LINE('0        1         2         3         4         5         6         7         8  ');
  3     DBMS_OUTPUT.PUT_LINE('12345678901234567890123456789012345678901234567890123456789012345678901234567890  ');
  4     DBMS_OUTPUT.PUT_LINE('0        1         2         3         4         5         6         7         8AB');
  5     DBMS_OUTPUT.PUT_LINE('12345678901234567890123456789012345678901234567890123456789012345678901234567890AB');
  6  END;
  7  /
0        1         2         3         4         5         6         7         8

12345678901234567890123456789012345678901234567890123456789012345678901234567890

0        1         2         3         4         5         6         7         8
AB
12345678901234567890123456789012345678901234567890123456789012345678901234567890
AB

PL/SQLプロシージャが正常に完了しました。
```

WORD_WRAPPEDの指定はDBMS_OUTPUT.PUTプロシージャでも有効になります。75バイト書き込んだ後、スペースを含めて8バイトの文字列「 ABCDEFG」と書き込むと、単語全体が改行して出力されます。次の例はDBMS_OUTPUT.PUTプロシージャを複数回使って、改行せずに文字列を書き込んでいます。

```
SQL> SHOW LINESIZE
linesize 80
SQL> SHOW SERVEROUTPUT
serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED
SQL> BEGIN
  2     DBMS_OUTPUT.PUT_LINE('0        1         2         3         4         5         6         7         8');
  3     DBMS_OUTPUT.PUT_LINE('12345678901234567890123456789012345678901234567890123456789012345678901234567890');
  4     DBMS_OUTPUT.PUT     ('123456789012345678901234567890123456789012345678901234567890123456789012345');
  5     DBMS_OUTPUT.PUT     (' ABCDEFG');
  6     DBMS_OUTPUT.NEW_LINE;
  7  END;
  8  /
0        1         2         3         4         5         6         7         8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890123456789012345678901234567890123456789012345
ABCDEFG

PL/SQLプロシージャが正常に完了しました。
```

WORD_WRAPPED指定でもスペースで区切られていない場合はバイト単位で計算されて、余った部分だけが改行されます。

```
SQL> BEGIN
  2     DBMS_OUTPUT.PUT_LINE('0        1         2         3         4         5         6         7         8');
  3     DBMS_OUTPUT.PUT_LINE('12345678901234567890123456789012345678901234567890123456789012345678901234567890');
  4     DBMS_OUTPUT.PUT     ('123456789012345678901234567890123456789012345678901234567890123456789012345');
  5     DBMS_OUTPUT.PUT     ('ABCDEFG');
  6     DBMS_OUTPUT.NEW_LINE;
  7  END;
  8  /
0        1         2         3         4         5         6         7         8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890123456789012345678901234567890123456789012345ABCDE
FG
```