PL / SQL курсор для расчета количества проектов - PullRequest
0 голосов
/ 14 декабря 2011

Я новичок в PL / SQL

Я должен завершить процедуру, которая вычисляет среднее значение идентификатора выбранного сотрудника, проанализированного с помощью параметра процедуры, и рассчитать количество проектов, которые этот сотрудник принял

вот мой стол:

CREATE TABLE employee(
empid number(5),
empname varchar(20),
address varchar(20),
no_of_dependents number(5),
deptno number(5),
CONSTRAINT EMPLOYEE_PKEY PRIMARY KEY(empid),
CONSTRAINT EMPLOYEE_FKEY FOREIGN KEY(deptno) REFERENCES department(deptno));

CREATE TABLE project(
projectno number(5),
location varchar(20),
incharge number(5),
rate_per_hour number(5),
CONSTRAINT PROJECT_PKEY PRIMARY KEY(projectno),
CONSTRAINT PROJECT_FKEY FOREIGN KEY(incharge) REFERENCES employee(empid));

CREATE TABLE assignment(
empid number(5),
projectid number(5),
hours number(5),
CONSTRAINT ASSIGNMENT_FKEY FOREIGN KEY(empid) REFERENCES employee(empid),
CONSTRAINT ASSIGNEMNT_FKEY2 FOREIGN KEY(projectid) REFERENCES project(projectno));

а вот в основном процедура pl / sql

set serveroutput on

create or replace procedure disp(idd number) is 

  cursor c1 is select avg(ass.hours) from assignment ass join employee e on
  e.empid=ass.empid
  where ass.empid=idd;

  cursor c2 is select empname from employee where empid=idd;
  v_name varchar(20);

  cursor c3 is select count(p.projectno)
  from employee e join project p on
  e.empid=p.incharge
  where p.incharge=idd;
  v_count_nr number;




begin
  open c1;
  fetch c1 into v_avg_nr;
  close c1;
  open c2;
  fetch c2 into v_name;
  close c2;
  open c3;
  fetch c3 into v_count_nr;
  close c3;

  dbms_output.put_line('Employee: '||idd);
  dbms_output.put_line('Employee Name: '||v_name);
  dbms_output.put_line('Number of projects: '||v_count_nr);
  dbms_output.put_line('Average Working Hours: '||v_avg_nr);



  end disp;
  /

  execute disp(101);

Я ожидаю проблем, когда c3 должен посчитать количество проектов, которые сотрудник занял

Он считает неправильно Вот вывод, что я получаю:

Employee: 101
Employee Name: Marlen
Number of projects: 20
Average Working Hours: 107.4

Спасибо за помощь! как я могу проверить, если среднее рабочее время составляет менее 10, то зарплата сотрудника остается прежней, в противном случае проверьте, если номер проекта составляет менее 4, то 5% от зарплаты, иначе 10% от заработной платы добавляется к зарплате

1 Ответ

0 голосов
/ 14 декабря 2011

Попробуйте удалить предложение group by в курсоре c3.Кроме того, c1 - это среднее рабочее время для всех сотрудников: это то, что вы ожидаете?Вы можете достичь того, что делаете в обычном запросе, используя стандартные функции агрегирования.

...