【问题标题】:PL/SQL how to write multiple statement in a single stored procedurePL/SQL 如何在单个存储过程中编写多条语句
【发布时间】:2012-10-29 02:47:44
【问题描述】:

我需要做以下问题,

编写一个程序,将所有获得收入的员工的工资降低 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;

现在我需要连接两者..​​ 我该怎么做...

【问题讨论】:

  • 请用您目前编写的代码更新问题。
  • 编写一个程序,将所有收入低于当前平均工资的员工的工资降低 10%。
  • @Hoque:只要写一个游标,它会获取当前工资低于当前平均工资的员工。在循环中首先放置一个 dbms 语句,该语句将打印该 emp 详细信息,然后下一条语句将 emp 的薪水更新为 10%。我不知道您为什么要为此创建多个程序。如果您提到其他内容,请相应地编辑您的问题
  • @GauravSoni 我不知道.. 我以为我必须在单个存储过程中编写多个选择语句。
  • @HoqueMaqsud: 不知道 :( ,你在你的问题中指定你已经写了子问题,它们是什么?

标签: sql oracle plsql


【解决方案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;

语法可能有点不对劲,当你得到它的工作时,将你的答案作为新答案发布在这里,并将其标记为答案,你更多更有可能获得帮助以后会这样。

【讨论】:

  • 是的,我已经做到了。但是我怎么能将它们全部合并到一个过程中。
  • 我认为对于 select 语句我需要声明变量。
  • 我该如何处理这个“将表 EMP 的内容视为“所有员工”。”
  • @HoqueMaqsud:我认为all employees 意味着所有的 avg sal 都是基于整个 emp 表而不是基于某些组条件,就像有时我们使用每个部门的基础上的 avg .
【解决方案2】:
    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;

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      创建或替换过程 DISPLAY_EMP 是 是 光标 emp_cur 是 选择姓名 ,萨尔 来自雇员 其中 SAL

      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 开始 显示_EMP; 结束;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        相关资源
        最近更新 更多