我遇到与标题相同的错误:
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
可能是什么问题?我可以在控制台中执行相同的操作,它将起作用。
答案 0 :(得分:4)
您需要通过将单引号加倍来对嵌入在字符串文字中的单引号进行转义:
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
这就是人们通常将dollar quoting用于函数主体的原因:
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语句更改为select some_column from ..
或类似的内容