【问题标题】:How do I make multiple queries in the same stored procedure in PostgreSQL?如何在 PostgreSQL 的同一个存储过程中进行多个查询?
【发布时间】:2021-08-18 11:15:34
【问题描述】:

我需要一个存储过程来做两件事。首先,我想获取所有以“myschema_”为前缀的架构名称,所以我这样做了:

SELECT schema_name
FROM information_schema.schemata
WHERE schema_name LIKE 'myschema_%'

接下来,我想要一个循环遍历每个模式并从“person”表中获取“name”的 while 循环。这意味着我必须以某种方式将第一个 select 模式语句的结果作为参数提供给下一次调用。所有这些都应该是一个存储过程。

这就是我希望存储过程返回的内容:

|  schema  | name |
-------------------
| schema_1 | Mike |
| schema_1 | Jane |
| schema_2 | Rich |
| schema_3 | Fred |
| schema_4 | Chris|

我该怎么做?

【问题讨论】:

  • 请添加有关您的问题的完整详细信息
  • @AkhileshMishra 我缺少什么细节?
  • 在 postgresql 过程中不会返回任何值。你必须为它写一个函数。
  • 嗯,知道了,谢谢。

标签: postgresql stored-procedures while-loop schema plpgsql


【解决方案1】:

您需要 plpgsql 块或过程以及动态 SQL 来执行此操作。

create or replace function my_function()
returns table (sname text, pname text) as
$$
DECLARE
  running_schema text;
  running_name text;
  DYN_SQL constant text default 'select "name" from %I.person';
BEGIN
  for running_schema in --your query 
   SELECT schema_name FROM information_schema.schemata WHERE schema_name LIKE 'myschema_%'
  loop
    for running_name in execute format(DYN_SQL, running_schema) loop
       sname := running_schema;
       pname := running_name;
       return next;
    end loop;
  end loop;
END;
$$ language plpgsql;

-- Unit test
SELECT sname, pname from my_function();

【讨论】:

  • @a_horse_with_no_name 如果查询的SELECT 列表只有一个条目,则不是。
  • 当我运行它时,它说:错误:没有指定语言 SQL 状态:42P13
  • 我的遗漏。我已经在最后一行编辑了答案$$ language plpgsql;
  • @Stefanov.sm 不知道是不是这里有什么我误解了,但是我还是没有从存储过程中得到任何东西......它说它已经成功完成了,但我没有说出名字......我很困惑......当我从她的服务器调用存储过程时,它说“查询没有返回任何结果。”
  • 嗯,这只是您的实际过程(或函数,以防您希望它返回某些内容)的框架。请。在 cmets 所在的位置添加您的程序逻辑。您希望返回什么?
猜你喜欢
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多