PL / SQL如何在单个存储过程中编写多个语句

时间:2012-10-08 15:13:40

标签: sql oracle plsql

我需要做以下问题,

编写一个程序,将所有员工的工资降低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 个答案:

答案 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;