2011-08-25 25 views
0

enter image description here編寫存儲過程來完成查找

請幫我從這種情況

我必須創建一個函數來獲取經理的名字對於一個給定的僱員。 (我試圖加入emp表來自己做這個,但不知道。)另外,我需要編寫一個SQL select語句,它使用該函數生成一個僱員編號和名稱以及他們的經理姓名列表

謝謝

+0

順便說一句,這是作業嗎? –

+0

只是整理練習用紙 –

+0

好像給我做作業一樣。 –

回答

2

Filip's function是不是爲這是從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表上引入另一個不必要的讀取時表現不夠好。

但是作爲Filip日子,這個正確的應該在SQL中完成,並且EMP表的JOIN自己加入。

+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 (+) 

我用左這裏加入也處理「大老闆」,這沒有一個經理本人的邊緣情況。

編輯:更新查詢了一下甲骨文語法

+0

感謝您的快速回復,請問您可以在oracle中執行 –

+0

我更新了oracle(我記得,這是10年前) –

+0

我appriciated你的答案 –