13.10 BREAK
構文
BRE[AK] [ON report_element [action [action]]] ...
report_elementの構文は、{column|expr|ROW|REPORT}です。
actionの構文は、[SKI[P] n|[SKI[P]] PAGE] [NODUP[LICATES]|DUP[LICATES]]です。
次に示すような、レポート内での変更位置および実行する書式設定のアクションを指定します。
-
特定の列について重複する値の非表示
-
特定の列値が変更されるたびに1行スキップ
-
特定の列値が変更されるたび、またはレポートの終わりにCOMPUTEによって計算された数値を出力
「COMPUTE」コマンドを参照してください。
現在のBREAKの定義を表示するには、句を指定せずにBREAKと入力します。
項
ON column [action [action]]
アクションを指定する場合は、指定した列(ブレーク列)でブレークが発生するたびにSQL*Plusがとるアクションを指定します。(columnには、表もビューも追加できません。これを行うために、SQL文の中でその列に別名を付けることができます。)ブレークとは、列または式の値の変更、行の出力またはレポートの終わりの3つのイベントのいずれかです。
アクションを省略した場合、BREAK ON列は、columnの中の重複する値を出力せず、対応するCOMPUTEコマンドに指定された計算をSQL*Plusが実行するレポート内の位置にマークが設定されます。
ON columnは、1回以上指定できます。次の例のように、複数のON句を指定したとします。
BREAK ON DEPARTMENT_ID SKIP PAGE ON JOB_ID - SKIP 1 ON SALARY SKIP 1
最初のON句は、最も外側のブレーク(この場合はON DEPARTMENT_ID)を表し、最後のON句は、最も内側のブレーク(この場合はON SALARY)を表します。SQL*Plusは、それぞれの出力行から指定されたブレークを検索します。このとき、最も外側のブレークから始めて、最も内側のブレークに到達するまで、入力された句の順序で処理が進められます。例では、SQL*Plusは、DEPARTMENT_ID、JOB_ID、SALARYの順で値の変更を検索します。
次にSQL*Plusは、最も内側のブレークについて指定されているアクションから始めて、最も外側のブレークまで、逆の順で各アクションを実行します(この例では、ON SALARYの場合のSKIP 1から始めて、ON DEPARTMENT_IDの場合のSKIP PAGEまで進みます)。SQL*Plusは、初期検索で見つかった最初のブレークについて指定されているアクションまでの各アクションを実行します。
たとえば、ある行でJOB_IDの値が変更され、DEPARTMENT_IDおよびSALARYの値には変更がなかった場合、SQL*Plusは、2行スキップしてからその行を出力します(1行はON SALARY句のSKIP1の結果で、もう1行はON JOB_ID句のSKIP1の結果です)。
ON columnを使用する場合は必ず、SQL SELECTコマンドの中でORDER BY句も使用する必要があります。通常、BREAKコマンドの中で使用する列は、ORDER BY句の中にも同じ順序で使用します(ただし、ORDER BY句で指定したすべての列をBREAKコマンドの中で指定しなくてもかまいません)。これは、レポート上の意味のない位置でのブレークの発生を回避するためです。
この項の前半で指定したBREAKコマンドが使用されている場合、次のSELECTコマンドによって、有効な結果が得られます。
SELECT DEPARTMENT_ID, JOB_ID, SALARY, LAST_NAME FROM EMP_DETAILS_VIEW WHERE SALARY > 12000 ORDER BY DEPARTMENT_ID, JOB_ID, SALARY, LAST_NAME;
DEPARTMENT_IDが同じであるすべての行がまとめて1ページに出力され、そのページの中では、JOB_IDが同じであるすべての行が1グループにまとめられます。それぞれの職種(JOB)グループの中では、SALARYが同じである職種がグループにまとめられます。このBREAKコマンドにはLAST_NAMEは指定されていないので、LAST_NAME内にブレークがあってもアクションは実行されません。
BREAKコマンドでは、NULL同士は等しいとみなされますが、その他の値とは等しくありません。これは、WHERE句でのNULLの扱いとは異なります。
ON expr [action [action]]
アクションを挿入する場合は、式の値が変更されたときにSQL*Plusがとるアクションを指定します。
アクションを省略した場合、BREAK ON exprは、exprの中で重複する値を出力せず、対応するCOMPUTEコマンドに指定された計算をSQL*Plusが実行する位置にマークを設定します。
1つ以上の表列を含む式、あるいはSQL SELECTまたはSQL*PlusのCOLUMNコマンドでレポート列に割り当てられている別名を含む式を使用できます。BREAKコマンドの中で式を使用する場合は、SELECTコマンドの中での順序と同じ順序でexprを入力する必要があります。たとえば、SELECTコマンドの中の式がa+bである場合、BREAKコマンドの中でSELECTコマンドの中の式を参照するときに、b+aまたは(a+b)はいずれも使用できません。
ON columnに指定した情報は、ON exprにも適用できます。
ON ROW [action [action]]
アクションを挿入する場合は、SQL SELECTコマンドが行を戻したときにSQL*Plusがとるアクションを指定します。ROWブレークは、BREAKコマンド内のどこに指定してあっても、最も内側のブレークになります。特定の行についてBREAKを指定する場合は、必ずアクションを指定します。
ON REPORT [action]
対応するCOMPUTEコマンドに指定された計算を、SQL*Plusが実行するレポート内の位置にマークを設定します。総合計またはその他の総計値を出力するには、BREAK ON REPORTとCOMPUTEを併用します。
REPORTブレークは、BREAKコマンド内のどこに指定してあっても、最も外側のブレークになります。
SQL*Plusはレポートの終わりに1ページをスキップしないので、BREAK ON REPORT SKIP PAGEは使用できません。
SKI[P] n
ブレークが発生した行を出力する前に、n行スキップします。BREAK SKIP nは、PREFORMATがSET ONでないかぎり、SET MARKUP HTML ONモードでは動作しません。
[SKI[P]] PAGE
ブレークが発生した行を出力する前に、1ページ分として定義されている行数のみスキップします。1ページの行数は、SETコマンドのPAGESIZE句を使用して設定できます。PAGESIZEは、SQL*Plusが1ページとみなす行数を変更するのみです。したがって、SKIP PAGEを指定しても、NEWPAGE 0を指定しないかぎり、物理的なページ・ブレーク文字は生成されません。また、レポートに印刷されるデータの最終行の後にブレークがある場合、SQL*Plusはこのページをスキップしません。
NODUP[LICATES]
あるブレーク列の値が前の行の列値と同じ場合は、その値ではなく空白が出力されます。
DUP[LICATES]
使用方法
新しいBREAKコマンドを入力すると、前のBREAKコマンドは無効になります。
BREAKコマンドを取り消すには、CLEAR BREAKSを使用します。
例
職種の重複値、SALARYの平均および追加でSALARYの合計を出力するレポートを作成するには、次のコマンドを入力します。(この例では、部門50および80から、SH_CLERKおよびSA_MANの職種のみが選択されます)。
BREAK ON DEPARTMENT_ID ON JOB_ID DUPLICATES COMPUTE SUM OF SALARY ON DEPARTMENT_ID COMPUTE AVG OF SALARY ON JOB_ID SELECT DEPARTMENT_ID, JOB_ID, LAST_NAME, SALARY FROM EMP_DETAILS_VIEW WHERE JOB_ID IN ('SH_CLERK', 'SA_MAN') AND DEPARTMENT_ID IN (50, 80) ORDER BY DEPARTMENT_ID, JOB_ID;
DEPARTMENT_ID JOB_ID LAST_NAME SALARY
------------- ---------- ------------------------- ----------
50 SH_CLERK Taylor 3200
SH_CLERK Fleaur 3100
.
.
.
SH_CLERK Gates 2900
DEPARTMENT_ID JOB_ID LAST_NAME SALARY
------------- ---------- ------------------------- ----------
50 SH_CLERK Perkins 2500
SH_CLERK Bell 4000
.
.
.
SH_CLERK Grant 2600
********** ----------
avg 3215
DEPARTMENT_ID JOB_ID LAST_NAME SALARY
------------- ---------- ------------------------- ----------
************* ----------
sum 64300
80 SA_MAN Russell 14000
SA_MAN Partners 13500
SA_MAN Errazuriz 12000
SA_MAN Cambrault 11000
SA_MAN Zlotkey 10500
********** ----------
avg 12200
DEPARTMENT_ID JOB_ID LAST_NAME SALARY
------------- ---------- ------------------------- ----------
************* ----------
sum 61000
25 rows selected.