Вы должны избегать одинарных кавычек, встроенных в строковые литералы, удваивая их:
CREATE OR REPLACE FUNCTION func(param varchar) RETURNS varchar AS
'BEGIN
LOCK public.routes;
return (SELECT * FROM public.routes WHERE guid = ''test'');
END;' LANGUAGE plpgsql
Вот почему люди обычно используют цитирование доллара для тела функций:
CREATE OR REPLACE FUNCTION func(param varchar) RETURNS varchar AS
$body$
BEGIN
LOCK public.routes;
return (SELECT * FROM public.routes WHERE guid = 'test');
END;
$body$
LANGUAGE plpgsql
Однако, даже если вы правильно поняли синтаксис: функция не будет работать.Он определен для возврата единственного (скалярного) значения типа varchar
, но возвращает все строки таблицы маршрутов.Если вы хотите вернуть несколько строк, вам нужно определить функцию как returns setof
или returns table
.В вашем случае returns setof routes
будет применимо:
CREATE OR REPLACE FUNCTION func(param varchar)
RETURNS setof public.routes
AS
$body$
BEGIN
LOCK public.routes;
return (SELECT * FROM public.routes WHERE guid = 'test');
END;
$body$
LANGUAGE plpgsql
Если вы намереваетесь вернуть значение одного столбца одной строки (при условии, что guid
определен как PK или уникальный), тогда действительноreturns varchar
будет работать.Но тогда вы должны изменить оператор выбора на select some_column from ..
или что-то подобное