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