Postgresql Postgres中的函数和游标
我正在设计一个使用两个游标的函数,我是Postgres的新手,所以我不知道我在做什么小的语法问题。我正在使用SQLFIDDLE实现此功能,收到的错误是:Postgresql Postgres中的函数和游标,postgresql,Postgresql,我正在设计一个使用两个游标的函数,我是Postgres的新手,所以我不知道我在做什么小的语法问题。我正在使用SQLFIDDLE实现此功能,收到的错误是: Schema Creation Failed: ERROR: syntax error at or near "+": 函数如下所示 CREATE OR REPLACE FUNCTION updateSalary() RETURNS VOID AS $BODY$ DECLARE DECLARE sum INT DEFAULT 0;
Schema Creation Failed: ERROR: syntax error at or near "+":
函数如下所示
CREATE OR REPLACE FUNCTION updateSalary() RETURNS VOID AS
$BODY$
DECLARE
DECLARE sum INT DEFAULT 0;
emp CURSOR FOR SELECT Dno, Salary FROM Employee;
emp_row RECORD;
dep CURSOR FOR SELECT Dno FROM Department;
dep_row RECORD;
BEGIN
open dep;
LOOP
FETCH dep into dep_row;
exit when dep_row = null;
open emp;
LOOP
FETCH emp into emp_row;
exit when emp_row = null;
if emp_row.Dno =dep_row.Dno then
SET sum = sum + emp_row.salary;
end if;
END LOOP;
UPDATE department SET total_sal = sum WHERE department.dno = emp_row.dno;
close emp;
SET sum = 0;
END LOOP;
close dep;
END;
$BODY$
LANGUAGE plpgsql;
我相信这里还有很多其他错误,所以如果有人向你发火,请告诉我,让我从调试postgresql的美妙乐趣中解脱出来
这是小提琴
出于某种原因,该函数没有保存到该小提琴中。我认为,为了挽救小提琴,它必须能够建造 以下几点值得一提
employee
和department
之间进行联接即可CREATE OR REPLACE FUNCTION updateSalary() RETURNS VOID
AS
$BODY$
DECLARE sum INT DEFAULT 0;
select sum = sum(emp.salary)
FROM Employee emp
join Department dept
on emp.Dno = dept.Dno;
UPDATE department as d SET total_sal = sum
FROM employee as e
WHERE d.dno = e.dno;
$BODY$
LANGUAGE plpgsql;
编辑:
稍微修改了光标定义。。试试看
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 <-- change here
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;
CREATE或REPLACE函数updateSalary()返回VOID作为
$BODY$
声明
和整数:=0;
部门光标,用于从部门中选择Dno;
行部门%ROWTYPE;
emp光标(dept_Dno INTEGER)用于张贴您正在使用的小提琴。@Rahul我在底部包含了一个指向小提琴的链接。非常感谢您的输入。不幸的是,我别无选择,只能使用游标,因为这是学习存储过程和游标的任务。@FatalProphet,ohh!!!你应该早一点提到。需要再检查一次。对不起,我应该知道得更清楚。这似乎是一个集体协议,即诅咒者是魔鬼,应该不惜一切代价避免。这让我想知道为什么两人都在教室里教它。@FatalProphet,它在教室里仍然很受欢迎;因此,您至少知道这个概念,但在实际操作中,应该避免使用游标,并且出于性能原因,应该使用简单连接来代替游标。无论如何,请参阅已编辑的答案并尝试一下。当我尝试使用更新的函数构建架构时,出现以下错误:架构创建失败:错误:在“)”处或附近缺少数据类型声明: