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

Posted

技术标签:

【中文标题】PL/pgSQL“for循环”+选择基本示例(“hello world”)【英文标题】:PL/pgSQL "for loop" + select basic example ("hello world") 【发布时间】:2019-04-11 17:19:18 【问题描述】:

我使用 Postgres 已经有一段时间了,但我对 PL/pgSQL 完全陌生。

我正在努力让基本的 for 循环工作。

这很好用:

-- Without SELECT
DO $$
BEGIN 
  FOR counter IN 1..6 BY 2 LOOP
    RAISE NOTICE 'Counter: %', counter;
  END LOOP;
END; $$;

但我真正想要的是遍历SELECT 查询的结果

我一直遇到这个错误:

查询错误:错误:对行进行循环的循环变量必须是记录或行变量或标量变量列表

对我来说听起来很模糊,谷歌搜索也没有帮助。

我想使用我自己的数据中的一个表(我希望使用SELECT * FROM mytable WHERE ‹whatever›),但我意识到我甚至无法让 for 循环工作使用更简单的数据

拿着这个:

-- with a SELECT
DO $$
BEGIN 
RAISE NOTICE 'Get ready to be amazed…';
FOR target IN SELECT * FROM generate_series(1,2) LOOP
    RAISE NOTICE 'hello'
END LOOP;
END; $$

这也会产生上述错误。我想打印一个简单的东西来掌握循环语法,比如:

你好 1 你好 2

我做错了什么?

【问题讨论】:

不幸的是,由于FOR IN SELECT声明的技术原因,应该声明迭代器。不同于FOR IN interval,也不同于PL/SQLFOR IN SELECT 【参考方案1】:

必须声明迭代器

DO $$
DECLARE 
    target record;
BEGIN 
    RAISE NOTICE 'Get ready to be amazed…';
    FOR target IN SELECT * FROM generate_series(1,2) LOOP
        RAISE NOTICE 'hello';
    END LOOP;
END; $$;

NOTICE:  Get ready to be amazed…
NOTICE:  hello
NOTICE:  hello

【讨论】:

如何访问该系列的内容?例如显示“hello 1”,然后显示“hello 2”。 选择SELECT * FROM generate_series(1,2) as "counter",然后选择RAISE NOTICE 'hello %', target.counter;

以上是关于PL/pgSQL“for循环”+选择基本示例(“hello world”)的主要内容,如果未能解决你的问题,请参考以下文章

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

PL/pgSQL INSERT INTO 表

如何在 PL/pgSQL 中获取动态生成的字段名称的值

在 PL/PGSQL 动态 SQL 内部函数中引用局部变量

如何在 PL/pgSQL 中的动态选择查询中使用迭代器变量?

Postgres PL/pgSQL,可以声明匿名自定义类型吗?