9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Node.js × SQLRPG連携(準備編)

Last updated at Posted at 2025-10-27

概要

Node.jsからSQLRPG(ILE)を呼び出し、JSON形式でデータを取得してブラウザに表示するプログラムを作成します。
本記事ではその「準備編」として、SQLRPG(ILE)側の処理について解説します。

環境情報

  • IBM i :7.3 QCCSID:5035
  • Node.js:v22.13.1
  • IFSにあるファイルは1208になります
  • 使用モジュール:itoolkit、fast-xml-parser、http

処理概要

IBM i のデータベースから情報を取得し、JSON形式の文字列に変換して返す処理です。
SQLでデータを取り出し、1件ずつ整形してJSON配列を作成しています。

SQLRPGプログラムの作成

サンプルソース

SQLTEST1.rpgle
**FREE                    
  CTL-OPT DFTACTGRP(*NO)  
          ACTGRP(*CALLER);
          
  //パラメータ受け取り
  DCL-PI *N;
    JSONRESULT CHAR(5000);
  END-PI;
  
  //外部プロシージャ
  DCL-PR QCMDEXC_WK EXTPGM('QCMDEXC');
    THECMD CHAR(3000) CONST;
    CMDLNE PACKED(15 : 5) CONST;
    DBCS CHAR(3) CONST OPTIONS(*NOPASS);
  END-PR;
  
  DCL-S CMD VARCHAR(100);
  DCL-S JSONLINE VARCHAR(1000);
  DCL-S JSONARRAY VARCHAR(5000);
  DCL-S FIRSTRECORD IND;
  DCL-DS TKMASPDS QUALIFIED;
    TKOKCD  CHAR(4);
    TKOKKJ  CHAR(52);
  END-DS;
  
  //環境設定
  CMD = 'ADDLIBLE LIB(QEOL) POSITION(*LAST)';
  QCMDEXC_WK (CMD : %LEN(CMD));

  //データ取得
  EXEC SQL
    DECLARE C1 CURSOR FOR
      SELECT TKOKCD, TKOKKJ
      FROM QEOL/TKMASP;
  EXEC SQL
    OPEN C1;
    
  FIRSTRECORD = *ON;
  JSONARRAY = '[';
  JSONRESULT = *BLANK;
  
  DOW SQLCODE = 0;
    EXEC SQL
      FETCH C1 INTO :TKMASPDS.TKOKCD, :TKMASPDS.TKOKKJ;
    IF SQLCODE = 0;
      IF NOT FIRSTRECORD;
        JSONARRAY += ',';
      ENDIF;
      JSONLINE = *BLANK;
      JSONLINE = '{"TKOKCD":"' +
                  %TRIM(TKMASPDS.TKOKCD) +
                  '","TKOKKJ":"' +
                  %TRIM(TKMASPDS.TKOKKJ) +
                  '"}';
      JSONARRAY += JSONLINE;
      FIRSTRECORD = *OFF;
    ENDIF;
  ENDDO;
  
  EXEC SQL
    CLOSE C1;
    
  JSONARRAY += ']';
  JSONRESULT = JSONARRAY;
  
  RETURN;

:bulb: 要点 ここからソース解説

1. QCMDEXCの呼び出しとライブラリ追加

RPGプログラム内でCLコマンドを実行するために、QCMDEXCプロシージャを宣言します。

DCL-PR QCMDEXC_WK EXTPGM('QCMDEXC');
  THECMD CHAR(3000) CONST;
  CMDLNE PACKED(15 : 5) CONST;
  DBCS CHAR(3) CONST OPTIONS(*NOPASS);
END-PR;

必要なライブラリ(例:QEOL)をADDLIBLEコマンドで追加し、SQLでのテーブル参照を可能にします。

DCL-S CMD VARCHAR(100);
CMD = 'ADDLIBLE LIB(QEOL) POSITION(*LAST)';
QCMDEXC_WK (CMD : %LEN(CMD));

2. SQLによるデータ取得

EXEC SQL文を使用してカーソルを宣言し、対象テーブル(例:TKMASP)から必要な項目を取得します。
FETCHループで1件ずつデータを読み込みます。

EXEC SQL
  DECLARE C1 CURSOR FOR
    SELECT TKOKCD, TKOKKJ
    FROM QEOL/TKMASP;
EXEC SQL
  OPEN C1;
DOW SQLCODE = 0;
  EXEC SQL
    FETCH C1 INTO :TKMASPDS.TKOKCD, :TKMASPDS.TKOKKJ;
  IF SQLCODE = 0;
    //文字列作成処理
  ENDIF;
ENDDO;

3. JSON形式で文字列作成

取得した各レコードをJSONオブジェクトとして整形します。
以下の流れでJSON配列を構築します。
 1. 最初のレコードでなければ、カンマを追加
 2. 取得したレコードからJSON文字列(JSONLINE)を作成
 3. JSON文字列をJSON配列(JSONARRAY)に追加

IF NOT FIRSTRECORD;
  JSONARRAY += ',';
ENDIF;             
                   
JSONLINE = *BLANK; 
JSONLINE = '{"TKOKCD":"' +
            %TRIM(TKMASPDS.TKOKCD) +
            '","TKOKKJ":"' +
            %TRIM(TKMASPDS.TKOKKJ) +
            '"}';
JSONARRAY += JSONLINE;
FIRSTRECORD = *OFF;

4. OUTパラメータでJSON文字列を返す

JSON配列をJSONRESULTに格納し、呼び出し元に返却します。

JSONRESULT = JSONARRAY;
RETURN;

SQLRPG側の解説は以上です。
次はNode.js側の実装について解説します!
Node.js × SQLRPG連携(Node.js実装編)

参考サイト

JBCC株式会社 IBM Powerコラム
フリーフォーマットRPGでプログラムを書いてみよう
chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://www.jbcc.co.jp/products/files/ibmpowercolumn202206_freeformatRPG.pdf

株式会社福岡情報ビジネスセンター FBI BLOG
FFRPG言語徹底解説~RPG開発においてSQLを使用するメリット~
https://fbicenter.co.jp/blog/20220720_embedded-sql#SQL


当記事の著作権はIBMに帰属します。
詳細はこちらを参照ください。

9
0
1

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
9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?