PL / SQL在If和循环

时间:2017-07-24 22:52:53

标签: sql oracle plsql

例如,我们有雇主工资和部门基于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;
/

提前致谢

4 个答案:

答案 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获取值,并分配给msalmdeptno

- 对于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; /