为啥在 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 存储过程中查询没有“结果数据的目标”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在从 Java 批量执行 PostgreSQL 存储过程时收到错误消息,提示“未预期结果”?

PostgreSQL,lo_export 查询到存储过程

PostgreSQL 存储过程:如何枚举查询

为啥此查询在 PostgreSQL 中不使用仅索引扫描?

PostgreSQL存储过程-基于SQL的存储过程

PostgreSQL存储过程-基于SQL的存储过程