如何在 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 保留关键字。
我正在尝试创建一个 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 保留关键字。