Re: JDBC CallableStatement bug on functions with return parameter - Mailing list pgsql-jdbc

From John LH
Subject Re: JDBC CallableStatement bug on functions with return parameter
Date
Msg-id 4D4D9056.5070605@aquafold.com
Whole thread Raw
In response to Re: JDBC CallableStatement bug on functions with return parameter  ("Kevin Grittner" <Kevin.Grittner@wicourts.gov>)
List pgsql-jdbc
  Hi,

 >> Try using BigDecimal, which *is* capable of storing exact
representations of all decimal fractions.

In my previous email I mentioned that I also tried BigDecimal and it did
not work.

 >> I've also tried the combination and results of ...
 >> ===
 >> java.sql.Types.DOUBLE/Double
 >> org.postgresql.util.PSQLException: ERROR: function
public.sales_tax(double precision) does not exist
 >> ===
 >> java.sql.Types.NUMERIC/BigDecimal
 >> org.postgresql.util.PSQLException: ERROR: function
public.sales_tax(numeric) does not exist

I am aware of the approximate datatype issue with Float and Double.  The
reason I tried Float and Double is because if I call
statement.execute("select * from tableWithMoney"), and then call
ResultSet.getObject("money_column"), it will actually return a Double
datatype.  Which is a possible bug in the JDBC driver.

I tried Float, Double and BigDecimal.  I can't find any documentation
indicating what datatype to use.  Looking at the JDBC driver code it
looks like it is incorrectly converting the SQL.

thanks
-John


On 2/5/2011 9:43 AM, Kevin Grittner wrote:
> John LH  wrote:
>
>> callStatement.registerOutParameter(1, java.sql.Types.FLOAT);
>
>> callStatement.setObject(2, new Float(25.25));
>
> PostgreSQL doesn't support using approximate data types (like Float)
> for money.  Try compiling and running this to see why:
>
> import java.math.BigDecimal;
> public class ExactnessTest
> {
>      public static void main(String[] args)
>      {
>          double approximate;
>          BigDecimal exact;
>
>          // Set an approximation of a penny.
>          approximate = 0.01;
>          // Put the actual value into an exact class.
>          exact = new BigDecimal(approximate);
>          // Show the actual value assigned to the double.
>          System.out.println(exact);
>          // Create and show an exact decimal penny.
>          exact = new BigDecimal("0.01");
>          System.out.println(exact);
>      }
> }
>
> Try using BigDecimal, which *is* capable of storing exact
> representations of all decimal fractions.  Note that feeding an
> approximate value, including an unquoted literal, to the BigDecimal
> constructor will cause the BigDecimal value to be less precise than
> you might expect.
>
> -Kevin
>

pgsql-jdbc by date:

Previous
From: "Kevin Grittner"
Date:
Subject: Re: JDBC CallableStatement bug on functions with return parameter
Next
From: zhong ming wu
Date:
Subject: Re: ssl connection strangely stops working