0

部門と従業員の 2 つのテーブルと、会社の平均給与を表示するこの PL/SQL ステートメントがあります。

DECLARE
  v_cavg NUMBER;
BEGIN
  SELECT avg(salary) into v_cavg FROM employee;
  DBMS_Output.Put_Line('Company Average Salary: ' ||    RTRIM(TO_CHAR(v_cavg,'$999G999G999D99')));
  DBMS_Output.Put_Line('----------------------------------------');
END;

私が今やろうとしているのは、カーソルを実装し、従業員テーブルと部門テーブルを結合して、会社の平均給与よりも部門の平均給与が低いすべての部門名を取得することです。私はカーソルが初めてで、これらの行のどこかにifステートメントが必要であることを知っています

if v_davg < v_cavg THEN
     DBMS_OUTPUT_.PUT_LINE ('Department Name: ' || RPAD(v_dname);
     DBMS_Output.Put_Line('Department Average Salary: ' ||    RTRIM(TO_CHAR(v_davg,'$999G999G999D99')));
  DBMS_Output.Put_Line('----------------------------------------');
else
     DBMS_Output.Put_Line(' '); /// Nothing here.
 END IF;
END;

カーソルを追加する方法がわかりません。

4

2 に答える 2

0

簡単な言葉が役に立ちます。

10:17:37 HR@sandbox> ed
Wrote file S:\tools\buffer.sql

  1  select d.department_name
  2    from departments d
  3         ,employees e
  4   where d.department_id = e.department_id
  5   group by d.department_name
  6*  having avg(salary) < (select avg(salary) from employees)
10:18:23 HR@sandbox> /

DEPARTMENT_NAME
------------------------------
Administration
Purchasing
IT
Shipping

Elapsed: 00:00:00.09

次のようにカーソルでラップすることもできます。

10:18:23 HR@sandbox> ed
Wrote file S:\tools\buffer.sql

  1  begin
  2    for i in (
  3      select d.department_name
  4        from departments d
  5             ,employees e
  6       where d.department_id = e.department_id
  7       group by d.department_name
  8       having avg(salary) < (select avg(salary) from employees)
  9     ) loop
 10       dbms_output.put_line(i.department_name);
 11     end loop;
 12* end;
10:20:29  13  /
Administration
Purchasing
IT
Shipping

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.07

IT 部門は伝統的に給与が最も低い部門の 1 つであることに注意してください。

于 2013-04-26T02:24:54.350 に答える