将函数参数转换为函数

时间:2013-05-20 19:12:14

标签: postgresql postgresql-9.2

我有这段代码

CREATE OR REPLACE FUNCTION test_func( str CHARACTER VARYING ) RETURNS CHARACTER VARYING 
AS $$

BEGIN
    str := CAST(str AS INTEGER);

    IF  str > 4 THEN
        RETURN 'YES';
    ELSE
        RETURN 'NO';
    END IF;

END;
$$
LANGUAGE plpgsql;

然后,当调用此函数SELECT test_func('9')

返回错误:operator does not exist: character varying > integer

为什么会这样?为什么str未转换为INTEGER

2 个答案:

答案 0 :(得分:2)

这被设计破坏了。

如果传递给函数的值是有效的integer,则参数的类型应为integer。否则函数体内的强制转换迟早会引发异常 它应该是:

CREATE OR REPLACE FUNCTION test_func(str integer) ...

然后你不需要任何演员。

并且 - 只要它像测试用例一样简单 - 使用带有CASE语句或纯SQL查询的SQL函数:

CREATE OR REPLACE FUNCTION test_func(str int)
  RETURNS text AS
$$
SELECT CASE WHEN str > 4 THEN 'YES' ELSE 'NO' END;
$$
LANGUAGE sql;

请注意,在Postgres 9.2之前,您无法在 SQL函数中引用参数 names 。使用旧版本中的位置参数$1

答案 1 :(得分:1)

它确实按照你的要求转换为整数。但随后它自动转换为varchar,因为它是str的类型。这样做:

IF str::int > 4 THEN