编写存储过程以进行查找

时间:2011-08-25 09:35:56

标签: oracle stored-procedures plsql

enter image description here

请帮助我摆脱这种情况

我必须创建一个函数来检索给定员工的经理名称。 (我试图加入emp表来做到这一点,但不确定。)另外我需要写  一个SQL select语句,它使用该函数生成员工编号和名称列表以及他们的经理名称

谢谢

2 个答案:

答案 0 :(得分:5)

正如您所指出的,解决方案是将emp表与自身连接起来。

CREATE FUNCTION fn_get_manager(p_empno IN NUMBER) 
   RETURN VARCHAR2
   IS manager VARCHAR2;
BEGIN 
   SELECT mgr.name 
     INTO manager 
     FROM emp e, emp mgr 
    WHERE e.mgr = mgr.empno
      AND e.empno = p_empno; 
   RETURN(manager); 
 END;

此查询可以包含在用户定义的函数中,其中@employee变量成为参数。

要返回员工列表,您可以在select语句中调用该函数

SELECT e.empno, e.name, fn_get_manager(e.empno)
  FROM emp e

虽然这种结构很有效,但对于这样一个简单的请求来说,这是一种可怕的方式。该函数将对emp表中的每个记录执行,与简单的join语句相比,结果将非常慢。

 SELECT e.empno, e.name, mgr.name
   FROM emp e,emp mgr 
  WHERE e.mgr = mgr.empno (+)

我在这里使用了一个左连接来处理“大老板”的边缘情况,而且他自己没有经理。

编辑:为oracle语法更新了一些查询

答案 1 :(得分:2)

对于从EMP表的查询中调用的函数,

Filip's function不是最佳解决方案。该表具有MGR属性,应该传递给函数。

CREATE FUNCTION fn_get_manager(p_mgr IN emp.mgr%type) 
   RETURN VARCHAR2
IS 
   manager emp.ename%type;
BEGIN 
   SELECT ename 
     INTO manager 
     FROM emp e 
    WHERE e.empno = p_mgr; 
   RETURN(manager); 
END;

这些事情表现得非常糟糕,而没有在EMP表上引入另外的不必要的读取。

但是作为Filip的日子,这应该在SQL中完成,并且EMP表的JOIN连接到它自己。