Thread: Jdbc4ResultSet getClob and getBlob are calling getLong internally
Server 8.4 on Ubuntu Driver type 4 version 8.4-701 After getting 'org.postgresql.util.PSQLException: Bad value for type long' I found these two methods in Jdbc4ResultSet: public java.sql.Clob getClob(int i) throws SQLException { checkResultSet(i); if (wasNullFlag) return null; return new Jdbc4Clob(connection, getLong(i)); } public java.sql.Blob getBlob(int i) throws SQLException { checkResultSet(i); if (wasNullFlag) return null; return new Jdbc4Blob(connection, getLong(i)); } Calling getLong here has to be wrong?
On Mon, 1 Feb 2010, Nedim Cholich wrote: > After getting 'org.postgresql.util.PSQLException: Bad value for type > long' I found these two methods in Jdbc4ResultSet: > > public java.sql.Clob getClob(int i) throws SQLException > { > return new Jdbc4Clob(connection, getLong(i)); > } > > Calling getLong here has to be wrong? > No. Large Objects are not stored directly inline, but as a pointer to other storage. The getLong is retrieving the external storage which Jdbc4Clob will then stream from the server on demand. You are probably trying to call getClob on a text or varchar column and that's not going to work. It might be nice to provide that interface, but there's no benefit (other than compatibility) to the user. If you have text data stored inline, then it's already been transferred over to the client side in the ResultSet, so there's no point in using a streaming interface. Kris Jurka
On Mon, Feb 1, 2010 at 15:15, Kris Jurka <books@ejurka.com> wrote: > On Mon, 1 Feb 2010, Nedim Cholich wrote: >> After getting 'org.postgresql.util.PSQLException: Bad value for type >> long' I found these two methods in Jdbc4ResultSet: >> >> public java.sql.Clob getClob(int i) throws SQLException >> { >> return new Jdbc4Clob(connection, getLong(i)); >> } >> >> Calling getLong here has to be wrong? >> > > No. Large Objects are not stored directly inline, but as a pointer to other > storage. The getLong is retrieving the external storage which Jdbc4Clob > will then stream from the server on demand. You are probably trying to call > getClob on a text or varchar column and that's not going to work. It might > be nice to provide that interface, but there's no benefit (other than > compatibility) to the user. If you have text data stored inline, then it's > already been transferred over to the client side in the ResultSet, so > there's no point in using a streaming interface. Yes, it's a TEXT column and yes I'm calling rs.getClob(columnName); What am I suppose to call instead? The above call produces: ... blah ... Caused by: org.postgresql.util.PSQLException: Bad value for type long : url=http://<removed> at org.postgresql.jdbc2.AbstractJdbc2ResultSet.toLong(AbstractJdbc2ResultSet.java:2796) at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getLong(AbstractJdbc2ResultSet.java:2019) at org.postgresql.jdbc4.Jdbc4ResultSet.getClob(Jdbc4ResultSet.java:43) at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getClob(AbstractJdbc2ResultSet.java:384) getFixedString(columnIndex) method called from AbstractJdbc2ResultSet:2019 is returning an actual column value (String) which toLong is trying to convert to long and failing. Thanks! What am I missing?
On Mon, Feb 1, 2010 at 15:42, Kris Jurka <books@ejurka.com> wrote: > On 2/1/2010 12:39 PM, Nedim Cholich wrote: >> Yes, it's a TEXT column and yes I'm calling rs.getClob(columnName); >> What am I suppose to call instead? > > getString Ahhh. Thanks. BTW, I'm converting an app from Mysql to Postgresql and this is definitely different between two servers.
Nedim Cholich <nedim@cholich.com> wrote: > Yes, it's a TEXT column and yes I'm calling > rs.getClob(columnName); > > What am I suppose to call instead? In PostgreSQL a text column is not a BLOB or CLOB. Try rs.getString(columnName); For BLOB behavior, see large objects: http://www.postgresql.org/docs/8.4/interactive/largeobjects.html -Kevin
On 2/1/2010 12:39 PM, Nedim Cholich wrote: > > Yes, it's a TEXT column and yes I'm calling rs.getClob(columnName); > > What am I suppose to call instead? > getString Kris Jurka