postgres sql: ОШИБКА: синтаксическая ошибка в или около "смещения" - PullRequest
0 голосов
/ 29 ноября 2018

Я использовал postgres для хранения данных / функций.Но есть сбивающая с толку проблема.

Вот моя функция:

 CREATE OR REPLACE FUNCTION sp_get_users_page(int4, int4)
   RETURNS SETOF entuser AS
 $BODY$
   DECLARE
      offset ALIAS FOR $1;
      pageSize ALIAS FOR $2;
      select_statement text;
      entuser_row entuser%ROWTYPE;
   BEGIN
      SET ENABLE_SEQSCAN = OFF;
      select_statement = "SELECT * from entuser order by 'userName' offset " || CAST(offset AS text) || " limit " || CAST(pageSize AS text);
      FOR entuser_row IN EXECUTE select_statement
      LOOP
          RETURN NEXT entuser_row ;
      END LOOP;
   END;
 $BODY$
   LANGUAGE 'plpgsql' VOLATILE;
 ALTER FUNCTION sp_get_users_page(int4, int4) OWNER TO postgres;

Вот ошибка:

ОШИБКА: синтаксическая ошибка в или около "смещения" ЛИНИЯ 11: ...из порядка пользователя по смещению 'userName' "|| CAST (смещение AS ...

Я не понимаю, где находится синтаксическая ошибка. Я с нетерпением жду, когда кто-нибудь может научить меня.

1 Ответ

0 голосов
/ 29 ноября 2018

Строковые константы должны быть заключены в одинарные, а не двойные кавычки.двойные кавычки предназначены для идентификаторов, например:

select_statement := 'select ... order by "userName" offset '||offset||' limit '||pagesize;

Но использование курсора и цикла излишне и делает запрос намного медленнее, чем нужно.Кроме того, для начала вам не нужен динамический SQL, вы можете использовать переменные непосредственно в статическом операторе SQL.

Таким образом, фактическая функция должна выглядеть следующим образом:

CREATE OR REPLACE FUNCTION sp_get_users_page(p_offset int, p_pagesize int)
   RETURNS SETOF entuser AS
 $BODY$
BEGIN
  SET ENABLE_SEQSCAN = OFF;
  return query 
     SELECT * 
     FROM entuser 
     ORDER BY "userName" 
     OFFSET p_offset
     LIMIT p_pagesize
END;
$BODY$
LANGUAGE plpgsql VOLATILE;

Но вам не нужен PL / pgSQL для такой простой функции для начала.Функция SQL обычно лучше:

CREATE OR REPLACE FUNCTION sp_get_users_page(p_offset int, p_pagesize int)
   RETURNS SETOF entuser AS
 $BODY$
   SET ENABLE_SEQSCAN = OFF;
   SELECT * 
   FROM entuser 
   ORDER BY "userName" 
   OFFSET p_offset
   LIMIT p_pagesize
$BODY$
LANGUAGE sql VOLATILE;

SET ENABLE_SEQSCAN = OFF; очень подозрительно - вам это действительно нужно?

...