创建一个返回员工经理的存储过程

时间:2016-11-28 01:17:39

标签: sql oracle stored-procedures plsql

我已完成以下操作来创建一个存储过程,该过程返回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表中的第一排,也是高级经理,所以在技术上他是他自己的经理。但是,无论我输入什么输入,为什么我都会获得相同的输出?

1 个答案:

答案 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字段中包含空值。只需使用内部联接。