我已完成以下操作来创建一个存储过程,该过程返回EMPLOYEE表中员工的经理:
[另外:REPORTSTO是一个NUMBER值,包含员工经理的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;
我总是得到'安德鲁亚当斯是安德鲁亚当斯的经理',无论我把它作为参数。安德鲁·亚当斯是EMPLOYEE表中的第一排,也是高级经理,所以在技术上他是他自己的经理。但是,无论我输入什么输入,为什么我都会获得相同的输出?
答案 0 :(得分:0)
你已经倒退了。这样:
LEFT OUTER JOIN EMPLOYEE MGR
ON EMP.EMPLOYEEID = MGR.REPORTSTO
应该是这样的:
LEFT OUTER JOIN EMPLOYEE MGR
ON MGR.EMPLOYEEID = EMP.REPORTSTO
一旦你纠正了这个问题,除了EMPLOYEEID = THE_EMPLOYEEID
之外,你在WHERE子句中不需要任何东西。
此外,我不会在此处使用左连接,除非您要在REPORTSTO
字段中包含空值。只需使用内部联接。