我需要做以下问题,
编写一个程序,将所有员工的工资降低10% 低于目前的平均工资。 将表EMP的内容视为“所有员工”。让您的程序打印第一个名称和工资 薪水低于平均水平的人。
解决问题的方法应该是什么?
编写一个程序,将收入低于当前平均工资的所有员工的工资降低10%。
CREATE OR REPLACE PROCEDURE UPDATE_EMP IS
BEGIN
UPDATE EMP
SET SAL= SAL-(SAL*0.1)
WHERE SAL<(SELECT AVG(SAL) FROM EMP);
END;
和另一个: 让你的程序打印工资低于平均水平的第一个人的姓名和工资。
SELECT e.ename
, e.sal
from
(select ename
, sal
from emp
where sal < (select avg(sal)
from emp
)
order by sal desc
)e
where ROWNUM =1;
现在我需要连接两个..我怎么能这样做......
答案 0 :(得分:1)
听起来你对存储过程是什么以及如何帮助你完成涉及许多SQL语句的复杂任务有点模糊。
您可以按照以下说明构建存储过程。
http://www.devshed.com/c/a/Oracle/Oracle-Stored-Procedures/
存储过程是一种很棒的结构,允许您将多个SQL语句放入一个结构中,从而节省了用于下一个SQL语句的变量。因此,您所要做的就是调用存储过程,并运行所有sql语句,并返回您的答案或提交表修改。
你需要这样的东西:
CREATE OR REPLACE PROCEDURE UPDATE_EMP RETURN name, value IS
BEGIN
UPDATE EMP
SET SAL= SAL-(SAL*0.1)
WHERE SAL<(SELECT AVG(SAL) FROM EMP);
SELECT e.ename INTO name_to_return, e.sal INTO sal_to_return from
(select ename, sal from emp where sal < (select
avg(sal)from emp) order by sal desc)e where ROWNUM =1;
RETURN name_to_return, sal_to_return;
END;
语法可能有些偏差,当你开始工作时,将答案作为新答案发布在此处,然后选中将其标记为答案,并且你很多更有可能获得帮助将来这样。
答案 1 :(得分:1)
CREATE OR REPLACE PROCEDURE DISPLAY_EMP IS
IS
CURSOR emp_cur
IS
SELECT ename
,sal
FROM emp
WHERE SAL<( SELECT AVG(SAL) FROM EMP)
ORDER BY sal desc;
v_emp_row emp_cur%ROWTYPE;
BEGIN
--update all the employee having sal less than avg sal
UPDATE EMP
SET SAL= SAL-(SAL*0.1)
WHERE SAL<(SELECT AVG(SAL) FROM EMP);
--display all the employee having sal less than avg sal
OPEN emp_cur ;
LOOP
FETCH emp_cur INTO v_emp_row;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('EMPLOYEE NAME : '||v_emp_row.ename||' '
||'SALARY : '||v_emp_row.sal);
END LOOP;
CLOSE emp_cur;
END DISPLAY_EMP;
--call the display_emp proc to display all the emp
BEGIN
DISPLAY_EMP ;
END;
答案 2 :(得分:0)
您需要一个程序来执行更新,另一个函数或select语句用于打印薪水刚好低于平均值的第一个人的姓名和工资。
答案 3 :(得分:0)
创建或替换程序DISPLAY_EMP IS IS CURSOR emp_cur IS SELECT ename ,SAL 来自emp SAL&lt;(从EMP中选择AVG(SAL)) 订单:sal desc; v_emp_row emp_cur%ROWTYPE;
BEGIN
--update all the employee having sal less than avg sal
UPDATE EMP
SET SAL= SAL-(SAL*0.1)
WHERE SAL<(SELECT AVG(SAL) FROM EMP);
--display all the employee having sal less than avg sal
OPEN emp_cur ;
LOOP
FETCH emp_cur INTO v_emp_row;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('EMPLOYEE NAME : '||v_emp_row.ename||' '
||'SALARY : '||v_emp_row.sal);
END LOOP;
CLOSE emp_cur;
END DISPLAY_EMP;
- 调用display_emp proc来显示所有的emp 开始 DISPLAY_EMP; END;