PSQLException:错误:“测试”或附近的语法错误

时间:2018-12-10 13:46:02

标签: postgresql plpgsql

我遇到与标题相同的错误:

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

可能是什么问题?我可以在控制台中执行相同的操作,它将起作用。

1 个答案:

答案 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 setofreturns 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 ..或类似的内容

相关问题