2013-05-20 4 views
0

У меня есть этот кодПреобразовать аргумент функции в функции

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

Почему это hapened? почему str не преобразован как INTEGER?

ответ

1

Это было отличное от целого, как вы просили. Но затем он сделал автоматическое преобразование в varchar, так как это тип str. Сделайте так:

IF str::int > 4 THEN 
2

Это нарушает дизайн.

Если значение, переданное функции, является действительным integer, для начала следует ввести параметр integer. Кроме того, литье внутри тела функции рано или поздно приведет к исключению.
Оно должно быть:

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

Тогда вам не нужно никакого литья.

И - до тех пор, как это просто, как тестовый пример - использовать функцию SQL с CASE оператором или простым SQL запросом:

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

Обратите внимание, что вы не можете обратиться к параметру имен в Функции SQL перед Postgres 9.2. Используйте позиционный параметр $1 в старых версиях.

Смежные вопросы