Данные не найдены в PL / SQL - PullRequest
       20

Данные не найдены в PL / SQL

1 голос
/ 21 сентября 2011

Я пытаюсь получить сотрудника, у которого нет менеджера, чтобы показать его на моем столе, но все, что я получаю, это "данные не найдены", когда я знаю, что такой сотрудник существует в БД.

этомой код:

ACCEPT p_1 PROMPT 'Please Enter Employee ID:'

declare 
  v_eid               employee.employee_id%TYPE := &p_1;
  v_count             NUMBER;
  v_name              employee.employee_name%TYPE;
  v_sal               employee.salary%type;
  v_mname             employee.employee_id%TYPE ;
  v_dptname           department.department_name%type;  
  v_avg               employee.salary%type;

BEGIN 
  SELECT count(*)
  INTO v_count
  FROM employee
  WHERE employee_id = v_eid;

  IF v_count = 0 THEN
      DBMS_OUTPUT.PUT_LINE(v_eid || ' is not in the table.');
  ELSE
      select e1.employee_name, e1.salary, department.department_name,
             nvl(e2.employee_name, 0)
      into v_name, v_sal, v_mname, v_dptname
      from employee e1
      inner join employee e2 on e1.manager_id = e2.employee_id 
      inner join department on e1.department_id = department.department_id
      where e1.employee_id = v_eid;

      select AVG(salary)
      into v_avg
      from employee
      where department_id = (select department_id 
                              from employee 
                              where employee_id=v_eid);
        DBMS_OUTPUT.PUT_LINE('Name:'|| LPAD(v_name,30));
        DBMS_OUTPUT.PUT_LINE('Salary:'|| LPAD(to_char(v_sal,'$9,999.00'),28));
        DBMS_OUTPUT.PUT_LINE('Manager Name:'|| LPAD(v_mname, 19));
        DBMS_OUTPUT.PUT_LINE('Department Name:'|| v_dptname);
        DBMS_OUTPUT.PUT_LINE('Department Average'|| to_char(v_avg,'$9,999.00'));
  END IF;
END;

Спасибо за помощь

Ответы [ 2 ]

7 голосов
/ 21 сентября 2011

Привет Если вы ищете только сотрудников без менеджера, почему вы делаете самостоятельное присоединение. В любом случае, если менеджера не существует, вы должны заменить

from employee e1 inner join employee e2 on e1.manager_id = e2.employee_id 

by

from employee e1 left outer join employee e2 on e1.manager_id = e2.employee_id 
6 голосов
/ 21 сентября 2011

В общем, сначала не проверяйте, существует ли запись, а просто выполняйте запрос. Если в этот момент записи не существуют, поймайте исключение.

begin
   select...

exception
   when no_data_found then
      xyz is not in the table
end;

Это лучше, потому что вы делаете запрос только один раз. Также запись может, по крайней мере теоретически, быть удалена между вашей проверкой и вторым запросом. Поэтому вам все еще нужен обработчик исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...