postgres JDBCドライバ8.X系でinterval型にinsertする方法

テーブル作成

CREATE TABLE foo(
 id INTEGER
,value INTERVAL
,CONSTRAINT foo_pkey PRIMARY KEY (id)
);

テストプログラム

Driver driver = DriverManager.getDriver("jdbc:postgresql");
System.out.println("version[" + driver.getMajorVersion() + "."
        + driver.getMinorVersion() + "]");
・・・省略・・・
ps1 = conn.prepareStatement("insert into foo values(?, ?)");
Date now = new Date();
java.sql.Date sysdate = new java.sql.Date(now.getTime());
// setString test
try {
    ps1.setInt(1, 1);
    ps1.setString(2, "12:00:30");
    ps1.executeUpdate();
} catch (SQLException e) {
    System.out.println("setString interval error!");
    System.out.println(e.getMessage());
}
// setTime test
try {
    Time time = new Time(sysdate.getTime());
    ps1.setInt(1, 2);
    ps1.setTime(2, time);
    ps1.executeUpdate();
} catch (SQLException e) {
    System.out.println("setTime interval error!");
    System.out.println(e.getMessage());
}

7.x系のJDBCドライバで実行すると

/home/yone/work/jdbc-test>./gotest.csh
version[7.4]

正常に動作し、テーブルを見ると

test=# select * from foo;
 id |  value
----+----------
  1 | 12:00:30
  2 | 22:02:26

プログラム変更せずに8.x系のJDBCドライバで実行

/home/yone/work/jdbc-test>./gotest.csh
version[8.1]
setString interval error!
ERROR: column "value" is of type interval but expression is of type character varying
setTime interval error!
ERROR: column "value" is of type interval but expression is of type character varying

エラー...

8.xのJDBCドライバを使用してinterval型へのデータ格納方法は以下の通りです。

1.SQLを CAST (? AS INTERVAL) に変更しsetStringを使用

insert into foo values(?, ?)
↓こう変更します
insert into foo values(?, CAST (? AS INTERVAL))

実行時はPreparedStatement#setString(idx, "15:35:12");

2.PGInterval型を使用

SQLは通常通りのものを使用

insert into foo values(?, ?)

org.postgresql.util.PGInterval pg = new org.postgresql.util.PGInterval();
pg.setValue("15:35:12");
// PreparedStatement#setObject
ps1.setObject(2, pg);

2.の場合、コンパイル時にpostgresのJDBCドライバが必要になってくる事
7.x系のJDBCドライバを使用している場合 PGIntervalが存在しない為
実行時に下記エラーが発生する事が問題です。
java.lang.NoClassDefFoundError: org/postgresql/util/PGInterval

gotest.csh

#!/bin/tcsh

set cp1=./classes
set cp2=./lib/pg74.214.jdbc3.jar
set cp3=./lib/postgresql-8.1-404.jdbc3.jar

set cp=${cp2}\:${cp1}
#set cp=${cp3}\:${cp1}

java -cp ${cp} JDBCTest