2016-11-28 5 views
0

я сделал следующее, чтобы создать хранимую процедуру, которая возвращает менеджер работника в ЕМРЬОУЕЙ таблице:Создайте хранимую процедуру, которая возвращает менеджер работника

[Дополнительно: REPORTSTO это числовое значение и содержит идентификатор менеджера сотрудника]

create or replace PROCEDURE MANAGER_OF_EMPLOYEE 
(
    THE_EMPLOYEEID IN NUMBER 
) 
AS 
    TEMP VARCHAR2(20); 
    TEMP2 VARCHAR2(20); 
    TEMP3 VARCHAR2(20); 
    TEMP4 VARCHAR2(20); 
BEGIN 
    SELECT MGR.FIRSTNAME, MGR.LASTNAME, EMP.FIRSTNAME, EMP.LASTNAME INTO TEMP, TEMP2, TEMP3, TEMP4 
    FROM EMPLOYEE EMP 
    LEFT OUTER JOIN EMPLOYEE MGR 
    ON EMP.EMPLOYEEID = MGR.REPORTSTO 
    WHERE EMP.EMPLOYEEID = THE_EMPLOYEEID AND EMP.REPORTSTO = MGR.EMPLOYEEID; 
    DBMS_OUTPUT.PUT_LINE(TEMP || ' ' || TEMP2 || ' IS THE MANAGER OF ' || TEMP3 || ' ' || TEMP4); 
END MANAGER_OF_EMPLOYEE; 

Я всегда получаю Эндрю Адамс является распорядителем Эндрю Адамс ", независимо от того, что я ставлю в качестве параметра. Эндрю Адамс является первой строкой в ​​таблице EMPLOYEE и является топ-менеджером, так что технически он является его собственным менеджером. Но почему я получаю тот же результат независимо от того, какой ввод я вкладываю?

+1

Я думаю, что ваше состояние ON неправильное. На Emp.Employee = Mgr.ReportsTo, а затем в WHERE у вас есть Emp.ReportsTo = Mgr.EmployeeID. – Sparky

ответ

0

Вы получили свое соединение назад. Это:

LEFT OUTER JOIN EMPLOYEE MGR 
ON EMP.EMPLOYEEID = MGR.REPORTSTO 

Должно быть так:

LEFT OUTER JOIN EMPLOYEE MGR 
ON MGR.EMPLOYEEID = EMP.REPORTSTO 

После того, как вы это исправить, вам ничего не нужно в вашем ИНЕКЕ кроме EMPLOYEEID = THE_EMPLOYEEID.

Кроме того, я бы не использовал левое соединение здесь, если у вас нет пустых значений в поле REPORTSTO, которое вы хотите включить. Просто используйте внутреннее соединение.

+0

Получил! Спасибо! –