2

在一个地方我有

CREATE FUNCTION updateGeo2(text, float4, float4) RETURNS float AS $$

随后是

SELECT updateGeo2('area', 40.88, -90.56);

我得到

error : ERROR:  function updategeo2(unknown, numeric, numeric) does not exist

所以它不知道我试图传入一个文本变量,然后是一个浮点变量和另一个浮点变量,它认为这些是“未知的,数字和数字”,la脚。我如何让它知道我传入的类型?

4

2 回答 2

2

试试这种方式:

SELECT updateGeo2('area', (40.88)::float4, (-90.56)::float4);
于 2012-12-07T20:05:18.717 回答
0

澄清误解

首先,这应该按原样工作,没有类型转换。我使用 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. 进行两种类型转换。

有关手册中数字常量的更多信息。

于 2012-12-07T20:37:42.890 回答