[pgsql-jp: 34962] Re: 8.0用のJDBC ドライバの障害

Hideaki Fuzisawa fhideaki @ pk.highway.ne.jp
2005年 3月 4日 (金) 15:15:13 JST


藤沢といいます。

>渡すと、charだろうというエラーとなって弾かれる。
確かに弾かれますね。

>7.4用のドライバに変えると、無事に動作するようになりました。
そのようです。

エラーというのは以下のような例外のことでしょうか?

java.sql.SQLException: ERROR: column "rec3" is of type timestamp without
time zone but expression is of type character varying
	at
org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorI
mpl.java:1471)
	at
org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.ja
va:1256)
	at
org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:175)
	at
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.j
ava:388)
	at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2St
atement.java:329)
	at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2State
ment.java:281)
	at
com.shiryo.core.resources.db.DataBaseExecuter.executeUpdate(DataBaseExecuter
.java:103)
	at
com.shiryo.test.core.resources.ExecDataBaseExecuter.checkConnect(ExecDataBas
eExecuter.java:36)
	at
com.shiryo.test.core.resources.ExecDataBaseExecuter.main(ExecDataBaseExecute
r.java:22)

rec3はtimestamp型で定義してあります。

DBUtilsについては使ったことがないのでよくわかりませんが
上記はJDBCのPreparedStatementでインサート文を発行したときに発生しました。

insert into datetest (rec3) values(?)

PreparedStatementではデータベースのデータ型にあわせて変数(?)に値をセット
します。
このときに setString()メソッドによってCHAR型として値をセットした場合上記のよ
うなエラーとなります。
しかし、setTimestamp()メソッドにより明示的にTIMESTAMP型として値をセットした
場合は

java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd
hh:mm:ss.fffffffff
	at java.sql.Timestamp.valueOf(Unknown Source)
	at
com.shiryo.core.resources.db.DataBaseExecuter.setParameter(DataBaseExecuter.
java:249)
	at
com.shiryo.core.resources.db.DataBaseExecuter.executeUpdate(DataBaseExecuter
.java:100)
	at
com.shiryo.test.core.resources.ExecDataBaseExecuter.checkConnect(ExecDataBas
eExecuter.java:36)
	at
com.shiryo.test.core.resources.ExecDataBaseExecuter.main(ExecDataBaseExecute
r.java:22)

となります。そもそも "050218 145052"なんていう文字列でTimstampは生成できない
ということですね。

これはバグというよりも厳密に型をチェックするように仕様変更されたのではないで
しょうか。
ただし、SQLでは実際に文字列としてinsertできるわけですから微妙な気はします
ね。使いずらいし・・・





pgsql-jp メーリングリストの案内