首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写一个存储过程来执行查找

问编写一个存储过程来执行查找
EN

Stack Overflow用户
提问于 2011-08-25 17:35:56
回答 2查看 101关注 0票数 0

​

​

请帮我摆脱这种情况

我必须创建一个函数来检索给定员工的经理姓名。(我尝试将emp表连接到自身以完成此操作,但不确定。)此外,我还需要编写一条SQL select语句,该语句使用该函数来生成员工编号和姓名及其经理姓名的列表

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-25 18:33:25

对于从EMP表的查询中调用的函数,Filip's function不是最佳解决方案。该表具有MGR属性,这是应该传递给函数的属性。

代码语言:javascript
复制
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表连接到自身。

票数 2
EN

Stack Overflow用户

发布于 2011-08-25 17:50:13

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

代码语言:javascript
复制
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语句中调用函数

代码语言:javascript
复制
SELECT e.empno, e.name, fn_get_manager(e.empno)
  FROM emp e

尽管这种构造可以工作,但对于如此简单的请求来说,这是一种可怕的方式。该函数将对emp表中的每条记录执行,与简单的join语句相比,结果将非常慢。

代码语言:javascript
复制
 SELECT e.empno, e.name, mgr.name
   FROM emp e,emp mgr 
  WHERE e.mgr = mgr.empno (+)

我在这里使用了左连接来处理“大老板”的边缘情况,因为“大老板”本身没有经理。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7188096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档