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;

そしてもう1人:あなたの手順に、給与が平均をわずかに下回る最初の人の名前と給与を印刷してもらいます。

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ステートメントを1つの構造に入れて、次の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

更新を行うための1つの手順と、給与が平均をわずかに下回る最初の人の名前と給与を出力するための別の関数またはselectステートメントが必要です。

于 2012-10-08T17:24:57.443 に答える
0

作成または置換手順DISPLAY_EMPISIS 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 に答える