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