【问题标题】:Call a FUNCTION from inside a PROCEDURE in PostgreSQL从 PostgreSQL 的 PROCEDURE 内部调用 FUNCTION
【发布时间】:2021-03-25 20:07:31
【问题描述】:

现在,我们正在将存储过程从 SQL Server 迁移到 Postgres。

我们有一个执行一些写操作的过程,然后它会调用一个列表函数来列出当前存在的所有数据。

create or replace procedure public.tree_create()
    language plpgsql
as
$$
BEGIN
   /* Insertion code goes here. */

    /* return result. */
    select * from public.tree_list();
END;
$$;

这会报错

[42601] 错误:查询没有结果数据的目的地 提示:如果要丢弃 SELECT 的结果,请改用 PERFORM。其中:PL/pgSQL 函数 public.tree_create() 第 4 行的 SQL 语句

那么我们如何通过调用函数来返回数据。仅供参考:该函数工作正常,当我们使用select * from list_tree() 调用它时,它将返回数据。

那么我们究竟如何在 STORED PROCEDURE 中调用 FUNCTION 来返回结果呢?还是有其他方法可以借鉴?

【问题讨论】:

  • 你想对函数的结果做什么?
  • @a_horse_with_no_name:返回结果并显示。

标签: postgresql


【解决方案1】:

程序并不意味着返回结果。您需要将其转换为函数:

create or replace function public.tree_create()
  returns table (... same signature as tree_list() ...)
    language plpgsql
as
$$
BEGIN
   /* Insertion code goes here. */

    return query
      select * from public.tree_list();
END;
$$;

然后像这样使用它:

select *
from tree_create();

【讨论】:

  • 我们最初选择了函数。但是在 SQL Server 的一些存储过程中,他们使用 TRANSACTION 来提交/回滚等。那么我们如何使用这些函数来实现呢?
  • @md-shah:如果您确实需要返回结果,调用者将需要处理事务。我可能会更改调用代码:一次调用该过程以执行插入(和事务处理),然后再次调用tree_list() 以获得结果。将太多职责合并到一个“模块”中从来都不是一个好主意
猜你喜欢
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多