*

[jt400, Java]レコードレベルアクセスの実現

公開日: : 最終更新日:2015/04/01 AS400, java

到着順

AS400のファイルシステムですと、レコードを読み込んで、処理して、出力して、次のレコード読んで……といった感じのレコードレベルのアクセス形式だったりします。
RDBに慣れてる人だと一括で読み込んで一括で処理して一括で出力するのが普通だと思います。

ついで、ファイルの中には、書き込まれた順序が大事な場合があります。
その場合は通常のRDBですと、Sequence numberなどを割り振りして、順序を保つのですが、レガシーなファイルを扱っていると、そんなことはしてない場合があります。
では、どうやって順序を保っているかというと、AS400の場合、到着順というアクセスパスがあります。
つまり、ファイルに書き込まれた順序を保持しています。もちろん、その順番で読み取ることが出来ます。

しかしながらSQLでは、Indexを付与していなかったり、Order byで指定しなかった場合、その順序は保証されません。
Indexを付けたり付け直したりすることによって、照会の順序が変わることがあります。
そして極めつけはSQLでは到着番号を取得出来ないんです。

もちろん行番号は取得できますが(ROW_NUMBER() OVER())、その行番号は照会結果に番号を振ったものですので、本来の到着番号ではないのです。

では、どのようにしてその到着順でファイルを扱うかというと、IBMのツールボックスを頼ることになります。

ソース

    public static void main(String[] args) {
        AS400 as400 = new AS400();
        QSYSObjectPathName path = new QSYSObjectPathName("HOGELIB", "HOGEFILE", "HOGEFILE", "MBR");
        
        SequentialFile file = new SequentialFile(as400, path.getPath());
        AS400FileRecordDescription recordDescription = 
        new AS400FileRecordDescription(as400, path.getPath());
        try{
            RecordFormat[] formats = recordDescription.retrieveRecordFormat();
            file.setRecordFormat(formats[0]);
            file.open();
            Record rec;
            while((rec = file.readNext()) != null){
                System.out.println(rec);
            }
            file.close();
        }catch(Exception e ){
            System.out.println(e);
        }
    }

解説

HOGELIBのHOGEFILEを到着順で読んで全部標準出力に出力しているだけです。
QSYSObjectPathNameを使わない場合”/QSYS.LIB/HOGELIB.LIB/HOGEGILE.FILE/HOGEFILE.MBR”という文字列をSequentialFileの第2引数に与えてもいいです。
ファイルを開く前の注意点として、AS400FileRecordDescriptionをインスタンス化して、セットしてください。
レコード記述がないとレコードをどう読んでいいのかわからない為Exceptionを吐き出します。

昔はなんとかしてファイルやらを減らしていたのでしょうがないのですが、到着順で運用するようなファイルを作らないのが一番です。

ad

関連記事

logo

[Java, jt400]AS400のCLからJavaをCallする方法。

久しぶりにAS400ネタ。 CLからJavaを呼び出したい!! JavaをCLから実行したい

記事を読む

logo

[C#]AS400のメンバーを指定してデータにアクセスする

◆前提条件◆ CliantAccessをインストールしている。 .NET Framework3.

記事を読む

logo

[java, NETBEANS]出来上がったclassファイルをコマンドラインで実行する。

コマンドラインから実行 以前作成したJavaのHelloWorldをコマンドラインから実行してみま

記事を読む

logo

[Java]DbUtilsでORA-12519エラー

DbUtilsを使ってたんですが、Oracleに対して処理するとORA-12519というエラーコード

記事を読む

cwbx.dll 参照の追加

[C#,AS400]C#でAS400のプログラムCallとコマンドの実行方法。

PCのプログラムからCall AS400のRPGPGMをPCから呼び出ししたいときがあります。

記事を読む

logo

[SQL, DB2]FETCH FIRSTで指定した行数データを取得する(営業日計算)

営業日計算 営業日を計算するのは結構面倒です。 特に独自のテーブルだと非常に厄介です。 例

記事を読む

logo

[java, jt400]AS400ネイティブ環境でjavaを起動し、ファイルに対するSQLを実行する方法。

日本語資料なさすぎだから自分で作ります。 AS400がでjavaを起動して、自分のファイルを見に行

記事を読む

logo

[Java, DBUtils]ApacheのDBUtilsを利用して、データベースにアクセスする。

手抜きがしたい オブジェクト指向をする上で、o/r mapperが欲しくなります。 かなーり昔に

記事を読む

NetBeans

[Java, NetBeans]NetBeansをインストールしてHelloWorldまで。

JavaのIDEは? よく挙げられるのがEclipseとNetBeans。 前はExclipse

記事を読む

logo

[C#, AS400]列挙体の文字列化&DB2/400にODBC接続

定数をなるべく書きたくないんです。 あとからメンテをするときに複数箇所変更しなくてはいけないから。

記事を読む

ad

Message

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

ad

  •  Auther;わなび

     「オープン系得意だよね? 俺のPCの調子悪いんだけど」という無茶振りから解き放たれゲームエンジニアに。
    C#とかUnityを扱います。
    Twitterフォロー大歓迎です。
    githubアカウント→wannabenote
  • follow us in feedly
PAGE TOP ↑