创建一个存储过程,接受并计算该部门的总工资并显示部门编号和总工资

Posted

技术标签:

【中文标题】创建一个存储过程,接受并计算该部门的总工资并显示部门编号和总工资【英文标题】:Creating a stored procedure that accepts and computes the total salaries for that department and displays both the department # & the total salaries 【发布时间】:2015-07-04 05:21:18 【问题描述】:

我在这里做错了什么?

创建一个接受部门编号的过程,计算该部门的总基本工资,并显示部门编号和总基本工资。

CREATE OR REPLACE PROCEDURE DEPT_TOTAL_SALARY AS 
BEGIN
   SELECT DEPARTMENTS.DEPARTMENTS_ID, SUM(SALARY) AS TOTAL_SALARIES
   FROM EMPLOYEES, DEPARTMENTS
   WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
   DBMS_OUTPUT.PUT_LINE (‘*** TOTAL SALARY CALCULATED ***’);
END;
/ 

第 6 行错误:PL/SQL: ORA-00933: SQL 命令未正确结束

    来自员工、部门 WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID DBMS_OUTPUT.PUT_LINE ('* 总工资计算 *'); 结束; /
Table:  EMPLOYEES                           
    EMPLOYEE_ID EMPLOYEE_NAME   JOB_ID  JOB_DESCRIPTION HOD HIREDATE    SALARY  DEPARTMENT_ID
              1        SMITH        J1         CLERK    5   17-Dec-07    5,800.00   20
              2        ALLEN        J2      SLAESMAN    3   20-Feb-08    7,600.00   30
              3         WARD        J2      SALESMAN    5   22-Feb-08    8,250.00   30
              4        JONES        J3       MANAGER    7   2-Apr-08     4,900.00   20
              5         JACK        J2      SALESMAN    7   28-Sep-08    6,700.00   10
              6        BLAKE        J3       MANAGER    7   1-May-08     12,850.00  30
              7        CLARK        J3       MANAGER   NULL 9-Jun-08     22,450.00  10
              8        SCOTT        J4       ANALYST    5   9-Dec-08     13,000.00  20
              9       TURNER        J2      SALESMAN    3   8-Sep-07     5,500.00   30
             10        ADAMS        J1         CLERK    5   12-Jan-07    9,100.00   20
Table:  DEPARTMENTS     
DEPARTMENT_ID   DEPARTMENT_NAME LOCATION
          10    ACCOUNTING  NEW YORK
          20    PRODUCTION  MINNESOTA
          50    SALES   CHICAGO
          40    OPERATIONS  BOSTON

如果 DeptNum 为 30,下面的查询代码会执行下面的代码吗?如果没有,如何编写代码根据上面的 EMPLOYEES 表计算每个部门的所有工资?

 DeptNum    Total_Salary
--------    ------------
      30     34,200.00 

CREATE OR REPLACE PROCEDURE Dept_Total_Salary (deptNum NUMBER)
        AS
          total_salary NUMBER(12, 2);
        BEGIN
          SELECT SUM(Salary)
            INTO total_salary
            FROM Employees
            WHERE Department_ID = deptNum;
          DBMS_OUTPUT.PUT_LINE('Department ' || deptNum || ' salary is ' || total_salary);
        END;

【问题讨论】:

Oracle 文档可能会有所帮助:docs.oracle.com/cd/B19306_01/server.102/b14200/… 我不太确定,但可能是上面的代码缺少 department_ID 的参数,如:CREATE OR REPLACE PROCEDURE DEPT_TOTAL_SALARY (department_id NUMBER) AS ... 看起来您缺少GROUP BY 子句。 我看到至少四个错误,但这里没有足够的信息来给你答案。请张贴两个表的结构,并指出哪个表/列包含部门编号。 【参考方案1】:

工资和部门编号都在EMPLOYEES 表中,因此您的查询中无需包含DEPARTMENTS 表。

您的查询中的错误是:

    您不接受部门编号作为存储过程的参数。

    您在不需要时包含DEPARTMENTS 表。

    您没有使用WHERE 子句按部门编号进行过滤。

    需要将工资总额选择成一个变量打印出来。

    SELECT 查询后需要一个分号。

试试这样的:

CREATE OR REPLACE PROCEDURE Dept_Total_Salary (deptNum NUMBER)
AS
  total_salary NUMBER(12, 2);
BEGIN
  SELECT SUM(Salary)
    INTO total_salary
    FROM Employees
    WHERE Department_ID = deptNum;
  DBMS_OUTPUT.PUT_LINE('Department ' || deptNum || ' salary is ' || total_salary);
END;

编辑:忘记了END 之后的分号,就在我指出你如何错过分号之后 - 哎哟!

【讨论】:

哇!!!!你的解释很透彻,很容易理解。非常感谢你。发布后我意识到我不需要 DEPARTMENTS 表。非常感谢。 我没有正确执行。它完美地工作。谢谢【参考方案2】:

接受部门编号

您做错的第一件事就是忽略了这方面的要求。您需要编写一个过程,该过程采用部门编号并使用where 子句来限制您从表中检索的内容。

【讨论】:

【参考方案3】:

这是我解决这个问题的方法。

CREATE TABLE proTable -- create new table to store sum of sal for each dept
    (deptno NUMBER,
    sumSal NUMBER);

CREATE OR REPLACE PROCEDURE display_dept_sal_sum (v_deptno NUMBER)
AS 
BEGIN
        INSERT INTO proTable (deptno,SumSal)
        SELECT v_deptno,SUM(sal) 
        FROM employees 
        WHERE deptno = v_deptno;
END;

EXECUTE  display_dept_sal_sum(40);
SELECT * FROM proTable;

【讨论】:

以上是关于创建一个存储过程,接受并计算该部门的总工资并显示部门编号和总工资的主要内容,如果未能解决你的问题,请参考以下文章

聚合函数并在 2 个条件下加入

查询各部门中高于部门平均工资的人员,人数及该部门的平均工资

oracle中的“线融合”

创建计算每个新插入员工的总工资的行级触发器

oracle创建触发器

oracle数据库根据条件删除数据