Re: JDBC CallableStatement bug on functions with return parameter

From: John LH <johnlh(at)aquafold(dot)com>
To: Kevin Grittner <Kevin(dot)Grittner(at)wicourts(dot)gov>
Cc: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: JDBC CallableStatement bug on functions with return parameter
Date: 2011-02-05 18:00:54
Message-ID: 4D4D9056.5070605@aquafold.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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
>

In response to

Browse pgsql-jdbc by date

  From Date Subject
Next Message zhong ming wu 2011-02-05 21:11:50 Re: ssl connection strangely stops working
Previous Message Kevin Grittner 2011-02-05 17:43:33 Re: JDBC CallableStatement bug on functions with return parameter