Написание хранимой процедуры для поиска - PullRequest
0 голосов
/ 25 августа 2011

enter image description here

Пожалуйста, помогите мне выйти из этой ситуации

Мне нужно создать функцию для получения имени менеджера для данного сотрудника.(Я пытался присоединить таблицу emp к себе, чтобы сделать это, но не уверен.) Также мне нужно написать оператор выбора SQL, который использует функцию для создания списка номеров и имен сотрудников вместе с именем их менеджера

Спасибо

Ответы [ 2 ]

5 голосов
/ 25 августа 2011

Как вы указали, решение состоит в том, чтобы объединить таблицу 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 e.empno, e.name, fn_get_manager(e.empno)
  FROM emp e

Хотя эта конструкция работает, это ужасный способ сделать это для такого простого запроса.Функция будет выполняться для каждой записи в таблице emp, и результат будет очень медленным по сравнению с простым оператором соединения.

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

Я использовал здесь левое соединение, чтобы также обработать крайний случай "большой босс ", у которого нет самого менеджера.

edit: обновлен запрос на синтаксис оракула

2 голосов
/ 25 августа 2011

Функция Филипа - не лучшее решение для функции, которая вызывается из запроса таблицы EMP. Эта таблица имеет атрибут 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.

Но как филиппинские дни, это должно быть правильно сделано в SQL с присоединением таблицы EMP к себе.

...