澄清误解
首先,这应该按原样工作,没有类型转换。我使用 PostgreSQL 9.1、9.2 和8.4.15进行了测试。您必须运行较早的版本,否则存在其他误解(例如 wrong search_path
)。您的信息具有误导性。
除了临时调用之外,您应该始终添加显式类型转换以消除歧义。PostgreSQL 允许函数重载。如果应该使用签名创建另一个函数:
CREATE FUNCTION updateGeo2(text, numeric, numeric) RETURNS text AS $$ ..
numeric
...然后由于数字文字的默认类型,它将优先于另一个。现有代码可能会中断。
另一方面,如果您添加一个函数:
CREATE FUNCTION updateGeo2(char(5), numeric, numeric) RETURNS text AS $$ ..
然后 Postgres 不知道该做什么了,抛出异常:
错误:函数 updategeo2(unknown, numeric, numeric) 不是唯一的
正确的语法
SELECT updateGeo2('area', '40.88'::float4, '-90.56'::float4);
或者,在标准 SQL 中更详细:
SELECT updateGeo2('area', cast('40.88' AS float4), cast('-90.56' AS float4));
或者,如果您真的想避免使用单引号(和冒号):
SELECT updateGeo2('area', float4 '40.88', float4 '-90.56');
这样,您可以直接将数字文字转换为数据类型float4
(= real
)。有关手册中类型转换
的
更多信息。
(40.88)::float4
也有效,但效果稍差。首先,40.88
被认为是类型numeric
(这个包含点的数字文字的默认类型)。然后将该值强制转换为float4
. 进行两种类型转换。
有关手册中数字常量的更多信息。