如何在 PostgreSQL 中的同一个存储过程中进行多个查询?
How do I make multiple queries in the same stored procedure in PostgreSQL?
我需要一个存储过程来做两件事。首先,我想获取所有以 'myschema_' 为前缀的模式名称,所以我这样做了:
SELECT schema_name
FROM information_schema.schemata
WHERE schema_name LIKE 'myschema_%'
接下来,我想要一个 while 循环来遍历每个模式并从 'person' table 中获取 'name'。这意味着我必须以某种方式将第一个 select 模式语句的结果作为下一次调用的参数提供。所有这些都应该是一个存储过程。
这就是我要的存储过程return:
| schema | name |
-------------------
| schema_1 | Mike |
| schema_1 | Jane |
| schema_2 | Rich |
| schema_3 | Fred |
| schema_4 | Chris|
我该怎么做?
您需要 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();
我需要一个存储过程来做两件事。首先,我想获取所有以 'myschema_' 为前缀的模式名称,所以我这样做了:
SELECT schema_name
FROM information_schema.schemata
WHERE schema_name LIKE 'myschema_%'
接下来,我想要一个 while 循环来遍历每个模式并从 'person' table 中获取 'name'。这意味着我必须以某种方式将第一个 select 模式语句的结果作为下一次调用的参数提供。所有这些都应该是一个存储过程。
这就是我要的存储过程return:
| schema | name |
-------------------
| schema_1 | Mike |
| schema_1 | Jane |
| schema_2 | Rich |
| schema_3 | Fred |
| schema_4 | Chris|
我该怎么做?
您需要 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();