Postgresql Postgres中的函数和游标

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;

我正在设计一个使用两个游标的函数,我是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;
  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,它在教室里仍然很受欢迎;因此,您至少知道这个概念,但在实际操作中,应该避免使用游标,并且出于性能原因,应该使用简单连接来代替游标。无论如何,请参阅已编辑的答案并尝试一下。当我尝试使用更新的函数构建架构时,出现以下错误:架构创建失败:错误:在“)”处或附近缺少数据类型声明: