Denodo ストアドプロシージャでの日時値の使用

ここでは、日時型の入力パラメーターや出力パラメーターを持つストアドプロシージャを開発する方法について説明します。

ストアドプロシージャを開発する際には、プロシージャのメインクラスで、プロシージャの出力スキーマを定義する getParameters() メソッドをオーバーライドする必要があります。このメソッドは、 StoredProcedureParameter オブジェクトの配列を返す必要があります。各オブジェクトは入力パラメーターまたは出力パラメーターを表します。

StoredProcedureParameter クラスのコンストラクターの 2 番目のパラメーターは type パラメーターです。このパラメーターの値は java.sql.Types クラスの定数です。

次の表は、以下の間のマッピングを示しています。

  • Denodo のデータ型と、 StoredProcedureParameter のコンストラクターに渡す必要がある java.sql.Types クラスの定数

  • Denodo のデータ型と、ストアドプロシージャが返す必要がある Java オブジェクトのクラス

Denodo のデータ型

java.sql.Types クラスの定数

入力パラメーターの Java クラス

出力値の Java クラス

localdate

Types.DATE

java.sql.Date

java.time.LocalDate または java.sql.Date

time

Types.TIME

java.sql.Time

java.time.LocalTime または java.sql.Time

timestamp

Types.TIMESTAMP

java.sql.Timestamp

java.time.LocalDateTime または java.sql.Timestamp

timestamptz

Types.TIMESTAMP_WITH_TIMEZONE

java.sql.Timestamp

java.time.OffsetDateTime または java.sql.Timestamp

intervalyearmonth

JDBCTypeUtil.INTERVAL_YEAR_MONTH

java.time.Period

java.time.Period

intervaldaysecond

JDBCTypeUtil.INTERVAL_DAY_SECOND

java.time.Duration

java.time.Duration

JDBCTypeUtil = com.denodo.vdb.vdbinterface.common.clientResult.vo.descriptions.type.util.JDBCTypeUtil

たとえば、 time 型の入力パラメーターを使用したい場合、 type パラメーターの値は Types.TIME でなければなりません。

実行時に、ストアドプロシージャが実行されると、実行エンジンはこのプロシージャの doCall(Object[] inputValues) メソッドを呼び出します。 inputValues 配列のオブジェクトの Java クラスは、 StoredProcedureParameter のコンストラクターで宣言されている type の値に依存します。

@Override
public StoredProcedureParameter[] getParameters() {

    return new StoredProcedureParameter[] {

          // Input parameter of type "localdate"
          new StoredProcedureParameter("date_field", Types.DATE, StoredProcedureParameter.DIRECTION_IN)

          // Input parameter of type "timestamp"
        , new StoredProcedureParameter("timestamp_field", Types.TIMESTAMP, StoredProcedureParameter.DIRECTION_IN)

          // Input parameter of type "timestamptz"
        , new StoredProcedureParameter("timestamptz_field", Types.TIMESTAMP_WITH_TIMEZONE, StoredProcedureParameter.DIRECTION_IN)

          // Input parameter of type "time"
        , new StoredProcedureParameter("time_field", Types.TIME, StoredProcedureParameter.DIRECTION_IN)

          // Input/output parameter of type "interval_day_second"
        , new StoredProcedureParameter("intervaldaysecond_field", JDBCTypeUtil.INTERVAL_DAY_SECOND, StoredProcedureParameter.DIRECTION_INOUT)

          // Output parameter of type "interval_year_month"
        , new StoredProcedureParameter("intervalyearmonth_field", JDBCTypeUtil.INTERVAL_YEAR_MONTH, StoredProcedureParameter.DIRECTION_OUT)
     };
}

以下のリストは、 doCall(...) のサンプルの実装を示しています。実行エンジンは、プロシージャを実行するためにこのメソッドを呼び出します。

doCall() の例
public void doCall(Object[] inputValues) {

    Date sqlDate = (Date) inputValues[0]; //Types.DATE
    LocalDate localDate = sqlDate.toLocalDate();

    Timestamp sqlTimestamp = (Timestamp) inputValues[1]; //Types.TIMESTAMP
    LocalDateTime localDateTime = sqlTimestamp.toLocalDateTime();

    Timestamp sqlTimestamptz = (Timestamp) inputValues[2];  //Types.TIMESTAMP_WITH_TIMEZONE
    OffsetDateTime offsetDateTime = sqlTimestamptz.toInstant().atOffset(ZoneOffset.UTC);

    Time sqlTime = (Time) inputValues[3]; //Types.TIME
    LocalTime localTime = sqlTime.toLocalTime();

    Duration d = (Duration) inputValues[4]; // JDBCTypeUtil.INTERVAL_DAY_SECOND
    Period p = (Period) inputValues[5]; ]; // JDBCTypeUtil.INTERVAL_YEAR_MONTH
}

日時値については、プロシージャはパッケージ java.sql または java.time のオブジェクトを返すことができます。

以下のリストでは、プロシージャは、同等の行を 2 つ返しています。最初の行は、java.sql パッケージのオブジェクトを使用して作成され、2 番目の行は java.time パッケージのオブジェクトを使用して作成されています。

public void doCall(Object[] inputValues) {

     // Adding a row with java.sql objects
     getProcedureResultSet().addRow(new Object[]{
         Date.valueOf("2017-10-11"),
         Timestamp.valueOf("2015-03-08 01:59:59"),
         new Timestamp(sdf.parse("2015-03-08 01:59:59 +01:00").getTime()),
         Time.valueOf("21:15:45"),
         Duration.ofHours(65).plusMinutes(23),
         Period.ofMonths(25)});

     // Adding a row with java.time objects
     getProcedureResultSet().addRow(new Object[]{
         LocalDate.parse("2017-10-11"),
         LocalDateTime.parse("2015-03-08T01:59:59"),
         OffsetDateTime.parse("2015-03-08T01:59:59+01:00"),
         LocalTime.parse("21:15:45"),
         Duration.ofHours(65).plusMinutes(23),
         Period.ofMonths(25)
}

以前のバージョンのストアドプロシージャとの互換性

以前のバージョンでは、java.sql.Types クラスの定数は、Denodo の別のデータ型にマップされています。

  • Types.DATE:

    • バージョン 7.0 以降: localdate にマップ

    • 以前のバージョン: date (非推奨) にマップ

  • Types.TIMESTAMP:

    • バージョン 7.0 以降: timestamp にマップ

    • 以前のバージョン: date (非推奨) にマップ

  • Types.TIME:

    • バージョン 7.0 以降: time にマップ

    • 以前のバージョン: long にマップ

まだこれらのオブジェクトに依存しているストアドプロシージャを開発した場合は、トークン USE_DENODO_6_0_TYPE_MAPPING を使用してそのプロシージャを宣言してください。次に例を示します。

CREATE PROCEDURE testnewtypesprocedure2
    CLASSNAME='com.denodo.vdb.test.TestNewTypesProcedure'
    CLASSPATH=''
    USE_DENODO_6_0_TYPE_MAPPING = true;