Обсуждение: Upgrading from 7.1.2 to 7.3.3 - function may need to add explicit typecasts

Поиск
Список
Период
Сортировка

Upgrading from 7.1.2 to 7.3.3 - function may need to add explicit typecasts

От
Stuart Woodward
Дата:
I have just reinstalled a database which has been working fine on
version 7.1.2 to 7.3.3 does anyone have any idea where and what typecast
I need to apply to get this test code work again?

--------------
1. The exception that I am getting is as follows:

java.sql.SQLException: ERROR:  Function calcprice(numeric, integer, numeric) does not exist
        Unable to identify a function that satisfies the given argument types
        You may need to add explicit typecasts
----------------------------------
2. The code that is being called is as follows:

String sql = "select calcPrice(?,?,?) ";
PreparedStatement st = getCon().prepareStatement(sql);
st.setDouble(1, listPrice);
st.setInt(2, type);
st.setDouble(3, amount);
rs = st.executeQuery();

----------------------------------
3. The SQL used to creat the function is as follows:

CREATE FUNCTION calcprice (float8, smallint, float8)
RETURNS float8 AS
SELECT float8larger(0, CASE
WHEN $2 = 1 THEN $1 - $3
WHEN $2 = 2 THEN $1 *(1 - $3)
ELSE $3
END )'
LANGUAGE 'sql'
----------------
4. From psql the function looks like this

test=> \df calcprice
                                  List of functions
 Result data type | Schema |   Name    |             Argument data types
------------------+--------+-----------+----------------------------------------------
 double precision | public | calcprice | double precision, smallint, double precision
(1 row)



Re: Upgrading from 7.1.2 to 7.3.3 - function may need to add explicit typecasts

От
Tom Lane
Дата:
Stuart Woodward <woodward@garage.co.jp> writes:
> java.sql.SQLException: ERROR:  Function calcprice(numeric, integer, numeric) does not exist

> CREATE FUNCTION calcprice (float8, smallint, float8)

There's no implicit coercion from integer to smallint in 7.3.  I'd
suggest changing the function's declared argument type to integer.

            regards, tom lane