2016-11-28 9 views
0

のマネージャーを返すストアドプロシージャを作成します。さらに[私はEMPLOYEE表に従業員のマネージャーを返すストアド・プロシージャを作成するために次のことを行っている従業員

を:[報告は数値であり、含まれてい私は常に取得する従業員の管理者のID]

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; 

は関係なく、私は、パラメータとして入れたものを「アンドリュー・アダムスは、アンドリュー・アダムスのマネージャーではありません」。 Andrew AdamsはEMPLOYEEテーブルの最初の行であり、トップマネージャーなので、彼は技術的に彼自身のマネージャーです。しかし、私は何を入力しても同じ出力を得るのはなぜですか?

+1

あなたのオン状態が間違っていると思います。 Emp.Employee = Mgr.ReportsToでは、後でEmp.ReportsTo = Mgr.EmployeeIDがあります。 – Sparky

答えて

0

あなたはあなたの後ろにあなたの参加を得ました。この:あなたはこれを修正したら、あなたはEMPLOYEEID = THE_EMPLOYEEID除いて、WHERE句で何もする必要はありません

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

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

がこのであるべき。

また、含めるREPORTSTOフィールドに空の値がない限り、ここでは左結合は使用しません。内部結合を使用するだけです。

+0

ありがとうございました! –

関連する問題