为啥在 PostgreSQL 存储过程中查询没有“结果数据的目标”?
Posted
技术标签:
【中文标题】为啥在 PostgreSQL 存储过程中查询没有“结果数据的目标”?【英文标题】:Why has a query no "destination for result data" in PostgreSQL stored procedure?为什么在 PostgreSQL 存储过程中查询没有“结果数据的目标”? 【发布时间】:2015-11-01 00:36:55 【问题描述】:我是 postgre 的新手,但遇到了问题。 我想完善程序:
CREATE OR REPLACE FUNCTION autenticarusuario()
RETURNS users AS
$BODY$`
DECLARE
login text;
senha text;
BEGIN
SELECT * FROM users WHERE login_user = login
AND pass_user = senha;
END;
$BODY$
LANGUAGE plpgsql IMMUTABLE
COST 100;
ALTER FUNCTION autenticarusuario()
OWNER TO postgres;
但我总是收到消息:
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function autenticarusuario() line 6 at SQL statement
********** Error **********
ERROR: query has no destination for result data
SQL state: 42601
Hint: If you want to discard the results of a SELECT, use PERFORM instead.
Context: PL/pgSQL function autenticarusuario() line 6 at SQL statement
【问题讨论】:
【参考方案1】:这里的问题是你告诉 Postgres“开始执行这个函数,然后执行这个查询”。 Postgres 抱怨是因为您没有告诉它如何处理查询结果。您可以使用 SELECT INTO
语句,也可以使用 RETURN QUERY
返回单个列,例如用户 ID:
CREATE OR REPLACE FUNCTION autenticarusuario()
RETURNS SETOF INTEGER AS
$BODY$`
DECLARE
login text;
senha text;
BEGIN
RETURN QUERY SELECT id
FROM users
WHERE login_user = login
AND pass_user = senha;
END;
$BODY$
LANGUAGE plpgsql IMMUTABLE
COST 100;
如果您想为每条记录返回多个字段,您可以使用与详述here 类似的策略并创建自己的类型。
【讨论】:
【参考方案2】:我的同事也遇到了类似的问题。然后,她在 select 查询之前使用了 OPEN MYCURS,在 select 查询之后使用了 RETURN MYCURS。
【讨论】:
以上是关于为啥在 PostgreSQL 存储过程中查询没有“结果数据的目标”?的主要内容,如果未能解决你的问题,请参考以下文章