postgres sql:错误:“偏移”处或附近的语法错误

时间:2018-11-29 09:39:21

标签: postgresql-9.2

我正在使用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 :(得分:0)

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

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;高度可疑-您真的需要吗?