gpt4 book ai didi

postgresql - Postgres 中过程/游标的逻辑问题

转载 作者:行者123 更新时间:2023-11-29 13:31:00 25 4
gpt4 key购买 nike

我正在使用 SQLFiddle 完成一项学习过程和游标的作业。我知道游标不是最好用的东西,有更好的方法可以完成我想做的事情,但我需要使用过程和游标。

我希望程序根据属于该部门的员工最终更新每个部门的 Total_sal。

现在它没有这样做,而且我真的没有足够的 Postgres 知识或经验来正确调试它。

updateSalary() 过程后部门的 Total_sal 应该如下所示:

dept_no    total_sal

10 7000
20 7000
30 6000

这是我正在使用的 fiddle :http://sqlfiddle.com/#!15/140d5/3

updatSalary 过程如下所示:

CREATE OR REPLACE FUNCTION updateSalary() RETURNS VOID AS
$BODY$
DECLARE
sum INTEGER := 0;
dep CURSOR FOR SELECT Dno FROM Department;
dep_row Department%ROWTYPE;
emp CURSOR(dept_Dno INTEGER) FOR
SELECT Dno, Salary FROM Employee WHERE Dno = dept_Dno;
emp_row Employee%ROWTYPE;
BEGIN
open dep;
LOOP
FETCH dep into dep_row;
exit when NOT FOUND;
open emp( dep_row.Dno );
LOOP
FETCH emp into emp_row;
exit when NOT FOUND;
sum := sum + emp_row.salary;
END LOOP;
UPDATE department SET total_sal = sum WHERE department.dno = emp_row.dno;
close emp;
sum := 0;
END LOOP;
close dep;
END;
$BODY$
LANGUAGE plpgsql;

最佳答案

您应该使用“FOR ... IN ... LOOP”语句 ( Cursors in documentation, see 40.7.4. )

CREATE OR REPLACE FUNCTION updateSalary() RETURNS VOID AS
$BODY$
DECLARE
total INTEGER := 0;
dep CURSOR FOR SELECT Dno FROM Department;
dep_row Department%ROWTYPE;
emp CURSOR(dept_Dno INTEGER) FOR
SELECT Dno, Salary FROM Employee WHERE Dno = dept_Dno;
emp_row Employee%ROWTYPE;
BEGIN
FOR dep_row IN dep
LOOP
FOR emp_row IN emp( dep_row.Dno )
LOOP
total := total + emp_row.salary;
END LOOP;
UPDATE department SET total_sal = total WHERE department.dno = dep_row.dno;
total := 0;
END LOOP;
END;
$BODY$ LANGUAGE plpgsql;

(sum是聚合函数名,最好不要用作变量名)

关于postgresql - Postgres 中过程/游标的逻辑问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23400844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com