タイガー!タイガー!じれったいぞー!(SE編)

AS400,WAS,GlassFish,Java,JavaEE,JSF等の開発における日々の気づきをまとめたブログ(備忘録)。

【AS400】RPGLE-日付・時刻型フィールド

DB2/400の日付・時間系のデータ項目を調査しましたので、まとめておきたいと思います。

まず、DB2/400で定義できるデータタイプは、下記の通り。
今回、サンプルテーブルを準備し、RPGJavaAS400内部ではなく、自分のローカルPCより実行)からその項目に書き込むためのサンプルを書いてみました。

データタイプ

タイプ 内容
L 日付型
T 時刻型
Z タイム・スタンプ型

サンプル・テーブル

TIGER/DBFSRC TEST02
     A                                      UNIQUE
     A          R RECW@00                   TEXT('テスト・テーブル') 
     A*      
     A            W@A001        10A         COLHDG('キー')
     A            W@L001          L         COLHDG(' 日付 ') 
     A            W@T001          T         COLHDG(' 時刻 ')
     A            W@Z001          Z         COLHDG(' タイムスタンプ ')
     A*          
     A          K W@A001

サンプル・プログラム

RPG書き込みテスト

TIGER/RPGLESRC SAMPLE24
     H DATEDIT(*YMD/)  
     H* 
     F**************************************************************************
     F* ファイル定義
     F**************************************************************************
     FTEST02    UF A E           K DISK 
     F* 
     D**************************************************************************
     D* MAIN  
     D**************************************************************************
      /FREE
          CLEAR RECW@00;
          W@A001 = 'RPG0000002';   
          W@Z001  = %TIMESTAMP();
          W@L001  = %DATE(); 
       // W@L001  = %DATE(20150120); // 日付を強制セットする場合 
          W@T001  = %TIME(); 
       // W@T001  = %TIME(120000);   // 時間を強制セットする場合
          WRITE  RECW@00;
          
          *INLR = *ON;
          RETURN;
      /END-FREE

Java書き込みテスト

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;

public class InsertDateFieldTest {
    static Connection conn = null;

    // JDBC(DB2/400)
    // jt400.jarをクラスパスに追加すること
    final static String DB_AS_DRIVER = "com.ibm.as400.access.AS400JDBCDriver";
    final static String DB_AS_CONNECTION = "jdbc:as400://192.168.1.2";
    final static String DB_AS_USER = "QUSER";
    final static String DB_AS_PASSWORD = "********";
    final static String DB400_DB_LIB_NAME = "TIGERDB";

    public static void main(final String[] args) throws Exception {

        try {
            // JDBCドライバのロード
            Class.forName(DB_AS_DRIVER);
            conn = DriverManager.getConnection(DB_AS_CONNECTION, DB_AS_USER,
                    DB_AS_PASSWORD);

            String strSql = "INSERT INTO " + DB400_DB_LIB_NAME
                    + ".TEST02 (W@A001,W@Z001,W@L001,W@T001) "
                    + " VALUES (?, ?, ?, ?) ";
            PreparedStatement pstmt = conn.prepareStatement(strSql);
            
            pstmt.setString(1, "0000000008");
            pstmt.setTimestamp(2, new Timestamp(System.currentTimeMillis()));
            
            pstmt.setDate(3, new Date(System.currentTimeMillis())); 
            //pstmt.setDate(3, java.sql.Date.valueOf("2015-01-20")); // 日付を強制セットする場合 
            
            pstmt.setTime(4, new Time(System.currentTimeMillis())); 
            //pstmt.setTime(4, java.sql.Time.valueOf("20:30:00"));   // 時間を強制セットする場合

            pstmt.execute();
            
            int count = pstmt.getUpdateCount();
            System.out.println("登録件数 : " + count);

            pstmt.close();

        } catch (SQLException e) {
            while (e != null) {
                System.err.println(e.getMessage());
                System.err.println(e.getSQLState());
                System.err.println(e.getErrorCode());
                e = e.getNextException();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            conn.close();
        }
    }
}

どちらのプログラムからも、簡単に書き込みに成功しました。

わかったことは、どれも、ブランクとしての値を保持できない点でしょう(当たり前か。それはNULLでしょ!ってことですね)。
AS400内でNULLを認める設定もありますが、RPG内で「NULL許可項目を使用します!」と宣言しなければならないなど、何かと面倒に感じます。
日付に値が入らないような任意項目が必要な場合には、数値項目として日付項目の代用として行うという手もあります。

最後に、PGMにて日時系項目に値をセットしない場合にセットされる初期値については、下記を参照ください。
自分の環境(V7R01)で実行した結果になります。参考までに。。。

値をセットしない場合に自動格納されるデフォルト値について

言語 タイプ 結果
RPGLE タイムスタンプ 0001-01-01-00.00.00.000000
RPGLE 日付 0001-01-01
RPGLE 時刻 00.00.00
Java タイムスタンプ (実行環境での)現在日付+時刻
Java 日付 (実行環境での)現在日付
Java 時刻 (実行環境での)現在時刻