在PostgreSQL过程中的CTE之后运行FOREACH



我有一个PLPGSQL过程:

A( 在Employee表中插入一名员工。B( 还将生成的串行eid插入到另一个Manager表中。C( 最后,该过程还指定了一个course_areas数组,我想将其插入到specialize表中。

程序,其中C和D数组为course_areas

CALL add_employee('Athena', '22222222', 'athena@outlook.com', '2012-12-12', '111', 'instructor', 300.0, NULL, 
'{C,D}'::text[]);

员工

CREATE TABLE Employees (
eid SERIAL PRIMARY KEY,
name TEXT NOT NULL,
phone TEXT NOT NULL,
email TEXT NOT NULL,
join_date DATE NOT NULL,
address TEXT NOT NULL,
depart_date DATE
);

经理

CREATE TABLE Managers (
eid INT PRIMARY KEY,
monthly_salary DECIMAL(10,2) NOT NULL,
FOREIGN KEY (eid) REFERENCES Employees(eid)
ON DELETE CASCADE
);

专业

CREATE TABLE Specializes (
eid INT NOT NULL,
name TEXT NOT NULL,
PRIMARY KEY (eid, name),
FOREIGN KEY (eid) REFERENCES Employees(eid)
on DELETE CASCADE,
FOREIGN KEY (name) REFERENCES Course_areas(name)
on DELETE CASCADE
);

procedure.sql

CREATE OR REPLACE PROCEDURE add_employee (name TEXT, phone TEXT, email TEXT, joinDate DATE, address TEXT, category TEXT, monthlySalary DECIMAL(10,2) default NULL, hourlySalary DECIMAL(10,2) default NULL, courseAreas TEXT[] default NULL)
...
WITH FIRST AS (
INSERT INTO Employees(
name, phone, email, join_date, address
) 
VALUES 
(
name, phone, email, joinDate, address
) RETURNING eid
), 
SECOND AS (
INSERT INTO Full_time_instructors(eid, monthly_salary) 
SELECT 
eid, 
monthlySalary 
FROM 
ROWS RETURNING eid
) 
FOREACH area IN ARRAY courseAreas 
LOOP 
RAISE NOTICE '%', area; -- should print "C" and "D"
END LOOP;

错误

ERROR:  syntax error at or near "FOREACH"
LINE 27:         FOREACH area IN ARRAY courseAreas

我可以让A和B去上班。

如何使用FOREACH迭代我传递给过程的courseAreas,以便将每个课程区域和eid插入到Specialize表中?

FOREACH是PLPGSQL控制结构,而CTE是SQL功能。你不能把这些混在一起。不使用CTE,您可以简单地执行第一条语句,使用RETURNING子句将eid检索到局部变量。然后,您可以将此变量与后续语句一起使用,并在FOREACH循环中使用。

这个问题概述了在PL/pgSQL中使用return获取新序列值:在INSERT之后获取默认序列值。

最新更新