PSQLException: ОШИБКА: синтаксическая ошибка в или около "теста" - PullRequest
0 голосов
/ 10 декабря 2018

Я получаю ту же ошибку, что и в заголовке:

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 голосов
/ 10 декабря 2018

Вы должны избегать одинарных кавычек, встроенных в строковые литералы, удваивая их:

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 .. или что-то подобное

...