postgres sql: ERROR: syntax error at or near "offset"

postgres sql: ERROR: syntax error at or near "offset"

我正在使用 postgres 来存储 data/function。 但是有一个令人困惑的问题。

这是我的函数:

 CREATE OR REPLACE FUNCTION sp_get_users_page(int4, int4)
   RETURNS SETOF entuser AS
 $BODY$
   DECLARE
      offset ALIAS FOR ;
      pageSize ALIAS FOR ;
      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;

这是错误:

错误:"offset" 处或附近的语法错误 LINE 11: ...from entuser order by 'userName' offset " || CAST(offset AS ...

我不明白语法错误在哪里。 我期待有人能教我。

字符串常量需要用单引号括起来,而不是双引号。双引号用于标识符,例如:

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; 非常可疑 - 你真的需要它吗?