我正在使用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 ...
我不明白语法错误在哪里。 我很期待有人可以教我。
答案 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;
高度可疑-您真的需要吗?