VIEWは不要!WebFOCUSでも出来る副問い合わせの方法を紹介!

2024年3月23日サポぶろぐ

皆さん、こんにちは!
株式会社アシストでWebFOCUSのサポートを担当しています津田です。

SQLでデータ検索をしたことがある方なら、WebFOCUSを使っていて1度は
思ったことがあるのではないでしょうか。

      「副問い合わせってどうすればいいんだろう??」

VIEWを用意して対応してくださっている方もいるかと思いますが、実はWebFOCUSでも
HOLDファイルを使うことで副問い合わせを実行することができるんです!

HOLDファイルについては本ブログのVol.16で紹介しているので、もし、まだ確認できていない…
という方はぜひ先にご確認下さい!
WebFOCUSの必須機能!HOLDファイルを知ろう!

では、早速WebFOCUSで副問い合わせをする方法を見ていきましょう。

WebFOCUSで副問い合わせをする方法

出力形式にFORMAT SQL_SCRIPTを指定することで、副問い合わせで使用できるSQL文を
生成できます。
また、最終リクエストのWHERE句の右辺にDB_INFILE関数を使用することで、
SQL文が格納されたHOLDファイルを副問い合わせとして発行することができます。

【サンプルと解説】


※例として、OracleのサンプルデータであるEMPテーブルとDEPTテーブルを使用しています

以下の副問い合わせのSQL文をDBに対して発行するレポートを作成したい場合。
(「SMITH」の所属している部署の詳細情報を表示するためのSQL)

-*-------------------------------------------------------------------------
SELECT
DEPTNO,DNAME,LOC
FROM DEPT
WHERE
(DEPTNO IN ( SELECT DEPTNO FROM EMP
WHERE(ENAME = 'SMITH'));
-*-------------------------------------------------------------------------

<サンプルプロシジャ>

-*-------------------------------------------------------------------------
-*EMP表からSMITH(ENAME)の部署コード(DEPTNO)を求めるリクエスト
TABLE FILE EMP
PRINT DEPTNO
WHERE ENAME EQ 'SMITH';
-*1
ON TABLE HOLD FORMAT SQL_SCRIPT                                              
END

-*HOLDファイルに存在するDEPTNO列の値と一致するレコードのみを抽出するリクエスト
TABLE FILE DEPT
PRINT DNAME
BY LOC
BY DEPTNO
-*2
WHERE DB_INFILE(HOLD,DEPTNO,DEPTNO);                                               
END
-*-------------------------------------------------------------------------

<プロシジャ解説>

*1:EMP表からDEPTNO列の値を求めるSQL文をhold.sqlという名前でHOLDファイルに保存します。
   出力形式を「SQL_SCRIPT」にすることで、SQL分の形でデータを保存します。

 ▼FORMAT SQL_SCRIPTについて
 副問い合わせで使用できるSQL文を生成し、一時ファイル(.sql)とシノニム(.acx、.mas)を
 作成します。上記サンプルプロシジャの場合、hold.sqlには以下のようなSQL文が格納されます。

    ----------------------------------------------------
     SELECT   T1."DEPTNO" AS "VB001_PRN_DEPTNO"
     FROM    SCOTT.EMP T1  
     WHERE  (T1."ENAME" = 'SMITH')
    ----------------------------------------------------

*2:DB_INFILE関数を使用して、*1で作成したHOLDファイルに格納されるSQL文を
   実行します。
   HOLDファイル内のDEPTNO列の値とDEPTテーブルのDEPTNO列の値を比較し、
   同じ値のレコードを抽出します。

 ▼DB_INFILE関数について
 DB_INFILE関数は、スクリプトファイルの実行結果(ターゲットファイル)と
 検索ファイル(ソースファイル)の項目値を比較する関数です。

    <構文>
    -----------------------------------------------------------
    DB_INFILE(file, s1, t1, ... sn, tn)
    -----------------------------------------------------------
     file                :ソースファイル名です。
     s1,.....sn          :ターゲットファイルの項目名です。
     t1,.....tn          :ターゲットファイルの項目名と比較するソースファイルの項目名です。

 上記のサンプルで指定した「DB_INFILE(HOLD,DEPTNO,DEPTNO)」は以下の
 意味になります。

   DB_INFILE(SQL_SCRIPTで生成したHOLDファイル名, DEPT表のDEPTNO列, HOLDファイルのDEPTNO列)

上記のサンプルプロシジャを実行すると、以下のようなSQL文がDBに対して発行され、
DB側で副問い合わせが行われます。

-------------------------------------------------------------------
SELECT
T1."DEPTNO",
T1."DNAME",
T1."LOC"
FROM
SCOTT.DEPT T1
WHERE
(T1."DEPTNO" IN ( SELECT
T1."DEPTNO" AS "VB001_PRN_DEPTNO"
FROM
SCOTT.EMP T1
WHERE
(T1."ENAME" = 'SMITH')))
ORDER BY
T1."LOC",
T1."DEPTNO";
-------------------------------------------------------------------

GUIで FORMAT SQL_SCRIPT 形式を設定する方法

「SQL_SCRIPT」形式のHOLDファイルをGUI操作で作成することも可能です。

【手順】


1)App Studioを起動し、新規レポートを作成します。

2)任意の項目、フィルタを追加します。

3)画面上部の[フォーマット]タブを選択し、[出力フォーマット]
– [スタイルなしフォーマット] – [SQL SELECTの生成(SQL_SCRIPT)]を選択します。

4)次に[ターゲット(HOLD)]ボタンをクリックし、[名前]に任意の名前を設定して[OK]を
クリックします。


複数のテーブルやリクエストを組み合わせてデータを取得したいとき、VIEWや
ストアドプロシジャを毎回作成しなくても、WebFOCUSだけで副問い合わせは
実行できます!

最初は書き方に慣れるのが大変かもしれませんが、是非副問い合わせに
挑戦してみてください。

次回は「WebFOCUS開発のプロが手放せないシステム変数5選!!」について紹介予定です。
お楽しみに!

<この記事をかいた人>

株式会社アシスト DX推進技術本部データ活用技術統括部  津田 明日香
入社歴   : 2018年新卒入社、4年間 WebFOCUS のサポートを専任
趣味     : アニメ鑑賞、最近はVtuberに熱中
ひとこと : 雨にも負けず、風にも負けずサポセン稼働中
      (なお土日は休みます)