创建一个存储过程,接受并计算该部门的总工资并显示部门编号和总工资
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;
【讨论】:
以上是关于创建一个存储过程,接受并计算该部门的总工资并显示部门编号和总工资的主要内容,如果未能解决你的问题,请参考以下文章