Help us understand the problem. What is going on with this article?

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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away