如何在 for 循环中使用行字段?

How to use a row field in a for loop?

我正在尝试创建一个 returns 自定义类型的函数,它以这种方式从 table 获取内容:

table

CREATE table users(
  id SERIAL PRIMARY KEY,
  first_name VARCHAR(255) NOT NULL,
  last_name VARCHAR(255) NOT NULL,
  birthday DATE NOT NULL
);

INSERT INTO users(first_name, last_name, birthday) VALUES
  ('Albert', 'Albertson', '2000-01-01'),
  ('Bernard', 'Bernardson', '2001-06-24'),
  ('Carl', 'Carlson', '2007-11-03')
;

类型

CREATE TYPE User_Data AS (
  id INTEGER,
  full_name VARCHAR(510),
  age INTEGER
);

函数

CREATE OR REPLACE FUNCTION get_user_data()
RETURNS SETOF User_Data AS $func$
  DECLARE
    user users%ROWTYPE;
    data User_Data;
  BEGIN
    FOR user IN SELECT * FROM users LOOP
      data.id := user.id;
      data.full_name := user.first_name || ' ' || user.last_name;
      data.age := DATEDIFF(year, user.birthday, NOW());
      RETURN NEXT data;
    END LOOP;
    RETURN;
  END;
$func$
LANGUAGE plpgsql;

问题

ERROR:  syntax error at or near "."
LINE 8:       data.id := user.id;
                             ^

显然,该函数无法访问 user 变量中的字段,尽管它是具有 id 的 users%ROWTYPE 类型。

请注意,如果我注释掉该行,错误将报告给下一行的 user.first_name,表明这不是该字段的问题,而是 user 变量的问题。

为什么它不起作用,我该如何解决?

user 是 PostgreSQL 的保留关键字——它不是好的 postgres 变量名。如果你需要它,那么你可能应该使用双引号:

data.id := "user".id;

在 plpgsql 中任何表达式都是 SQL 表达式,所以你不能在没有转义的情况下使用 SQL 保留关键字。