0

我需要做以下问题,

编写一个程序,将所有收入低于当前平均工资的员工的工资降低 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;

现在我需要连接两者..​​我怎么能这样做......

4

4 回答 4

2

听起来您对存储过程是什么以及它如何帮助您完成涉及许多 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;

语法可能有点不对劲,当您开始使用时,将您的答案作为新答案发布在这里,并将其标记为答案,您将来更有可能获得这样的帮助。

于 2012-10-08T15:37:46.280 回答
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;
于 2012-10-08T20:49:46.730 回答
0

创建或替换过程 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;

--调用display_emp proc来显示所有emp BEGIN DISPLAY_EMP ; 结尾;

于 2012-10-28T18:47:44.767 回答
0

您需要一个过程来进行更新,并且需要另一个函数或 select 语句来打印工资略低于平均水平的第一个人的姓名和工资。

于 2012-10-08T17:24:57.443 回答