PL/pgSQL 函数 - 遍历特定列并在循环中执行第二个查询

Posted

技术标签:

【中文标题】PL/pgSQL 函数 - 遍历特定列并在循环中执行第二个查询【英文标题】:PL/pgSQL functions - loop through specific column and execute second query in loop 【发布时间】:2014-03-09 14:16:13 【问题描述】:

正如您在标题中看到的,我想遍历保存建筑物 ID 的特定列,然后函数将执行第二个查询,该查询使用这些循环值并在 PostgreSQL 中显示查询结果。

请注意以下代码:

CREATE OR REPLACE FUNCTION getBID() RETURNS SETOF building AS
$BODY$
DECLARE
    r building%ROWTYPE;
BEGIN
    FOR r IN EXECUTE 'SELECT point_id FROM building'

    LOOP

    RETURN QUERY EXECUTE 'SELECT gid, nof, year 
    FROM building 
    WHERE point_id = ' || r;

    END LOOP;
    RETURN;
END
$BODY$
LANGUAGE 'plpgsql' ;

SELECT * FROM getBID();

我的建筑物 ID 是整数值。我想知道以下两个方面:

“r”变量应该声明为“整数”? 我的第二个查询也应该循环使用?

提前谢谢...

【问题讨论】:

你的循环没有任何意义。两个查询都从同一个表返回数据,因此您可以简单地删除第一个。并且整个函数可以用单个return query select gid, nof, year from building 替换。不再需要缓慢而繁琐的光标 【参考方案1】:

对于这样的琐碎任务,请改用simple SQL function:

CREATE OR REPLACE FUNCTION get_buildings()
  RETURNS SETOF building AS
'SELECT * FROM building' LANGUAGE sql;

或者只是:

SELECT * FROM building;

这是一个实际的 FOR loop 填充 plpgsql 中的单个列的示例:Returning results from a function in 'select statement' format

另一个匿名记录示例:Loop on tables with PL/pgSQL in Postgres 9.0+

Try a search.还有很多。

【讨论】:

你能给我一些代表“for循环方法”的例子吗?其实我需要这个。据我所知,互联网上实际上有太多的例子,但这些例子基本上是通过类似“select * from table”的查询来循环的。我想了解如何循环通过类似“从表中选择列”的查询。例如,我的查询将检索包含构建唯一 ID 的列,并使用这些 ID 迭代另一个查询。我用python或java编程语言完成了这个,但是我想学习PL/pgSQL函数如何处理这种情况...... @seroman:我添加了指向您要求的示例的链接。请注意,大多数情况下,SQL 中基于集合的方法比循环快得多。有例外...

以上是关于PL/pgSQL 函数 - 遍历特定列并在循环中执行第二个查询的主要内容,如果未能解决你的问题,请参考以下文章

循环通过 PL/PGSQL 中的 CURSOR 而不锁定表

PL/pgSQL 函数不能正常工作

PL/pgSQL“for循环”+选择基本示例(“hello world”)

使用 PostgreSQL PL/pgSQL 在 For 循环中添加月份

Postgres 9.2 PL/pgSQL 循环简单更新

如何在 pl/pgsql 中声明具有特定列名的行文字?