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(...)
のサンプルの実装を示しています。実行エンジンは、プロシージャを実行するためにこのメソッドを呼び出します。
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:
バージョン 8.0 以降:
localdate
にマップ以前のバージョン:
date
(非推奨) にマップ
Types.TIMESTAMP:
バージョン 8.0 以降:
timestamp
にマップ以前のバージョン:
date
(非推奨) にマップ
Types.TIME:
バージョン 8.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;