例如,我们有雇主工资和部门基于emp表。
在SQL中,我们可以通过执行此操作来检索每个部门的总薪水
SELECT SUM(SAL) FROM EMP WHERE DEPTNO = 20 ; //Lets put it we finding sum for dept 20.
但是对于pl / sql的其他地方,我认为我在语法上是错误的。我正在使用游标来存储所有数据。在我的if语句中,在下面的循环中,我用
尝试了我的逻辑if deptno = 20 THEN
totalSalary = sum(salary);
DBMS_OUTPUT.PUT_LINE('Department : 20' || total Salary);
这是我的实际代码。
DECLARE
msal emp.salary%TYPE;
mdept emp.departmentNo%TYPE;
new_salary number(10,2);
CURSOR E1 IS select salary , departmentNo from emp;
BEGIN
OPEN E1;
LOOP
FETCH E1 into msal , mdeptno;
IF mdeptno = 20 THEN
---- I cant seems to find the right logic here to print out the total sum for department 20---
END IF;
EXIT WHEN E1%NOTFOUND;
END LOOP;
CLOSE E1;
END;
/
提前致谢
答案 0 :(得分:0)
您可以为sum聚合引入另一个变量,并在每次循环迭代中添加它。 然后在需要时打印出来。
DECLARE
msal emp.salary%TYPE;
mdept emp.departmentNo%TYPE;
sum_salary number(10,2) := 0;
CURSOR E1 IS select salary , departmentNo from emp;
BEGIN
OPEN E1;
LOOP
FETCH E1 into msal , mdeptno;
sum_salary := sum_salary + msal;
IF mdeptno = 20 THEN
dbms_output.put_line(sum_salary);
EXIT WHEN E1%NOTFOUND;
END LOOP;
CLOSE E1;
PL / SQL允许您逐行访问(在幕后为您完成)
答案 1 :(得分:0)
使用变量totalSalary
保持运行总计算法如下:
- 从光标e1
获取值,并分配给msal
和mdeptno
- 对于msal
的每个获取值(在循环内),使用变量tot_sal
(或原始发布的totalSalary
)保持总计
使用您的方法,分配totalSalary := sum(salary);
除了抛出错误外什么也不做,因为salary
未定义为变量。光标将获取salary
(我的sal
)的值,并将其分配给msal
。
如果作业是totalSalary := sum(msal);
,那么它会写入先前提取的值并且不会跟踪正在运行的总数。
执行此操作的标准方法是在循环之前将tot_sal
初始化为零(或totalSalary
),然后为每个获取的记录保持运行总计:
tot_sal := tot_sal + msal;
这是与匿名块并列的简单sql结果:
SCOTT@dev>SELECT
2 SUM(sal)
3 FROM
4 emp
5 WHERE
6 deptno = 20;
SUM(SAL)
10875
SCOTT@dev>DECLARE
2 msal emp.sal%TYPE;
3 mdeptno emp.deptno%TYPE;
4 tot_sal emp.sal%TYPE;
5 CURSOR e1 IS
6 SELECT
7 sal,
8 deptno
9 FROM
10 emp;
11
12 BEGIN
13 tot_sal := 0;
14 OPEN e1;
15 LOOP
16 FETCH e1 INTO msal,mdeptno;
17 IF
18 mdeptno = 20
19 THEN
20 tot_sal := tot_sal + msal;
21 END IF;
22
23 EXIT WHEN e1%notfound;
24 END LOOP;
25
26 CLOSE e1;
27 dbms_output.put_line(tot_sal);
28 END;
29 /
10875
PL/SQL procedure successfully completed.
答案 2 :(得分:0)
没有必要将PL / SQL用于可以用SQL做的事情。但如果您真的需要它,请使用以下内容:
DECLARE
msal emp.salary%TYPE;
mdept emp.departmentNo%TYPE;
new_salary number(10,2);
CURSOR E1 (p_dept number) IS
select sum(salary) from emp where departmentNo = p_dept;
BEGIN
OPEN E1(20);
FETCH E1 into msal;
dbms_output.put_line(msal);
CLOSE E1;
END;
/
答案 3 :(得分:0)
谢谢你的回复, 我被分配在pl / sql中执行此操作,
我很感谢你们的回应。我用最简单的方法得到了sum,min和max以及avg的结果。
我基本上做的是使用已经在sql中的inbuild函数并在我的select语句中实现它。 我已经通过
解决了这个问题DECLARE
totalSal emp.salary%TYPE;
maxSal emp.salary%TYPE;
minSal emp.salary%TYPE;
mdept emp.departmentNo%TYPE := 20; /* for an example getting all values for dept 20 */
CURSOR E1 IS select sum(salary) , max(salary) , min(sal) from emp where
departmentNo = mdept group by departmentNo;
BEGIN
OPEN E1;
LOOP
FETCH E1 into totalSal , maxSal , minSal;
EXIT WHEN E1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('...' || maxsal); /*...so on for display*/
END LOOP;
CLOSE E1;
END; /