2013-07-16 107 views
0

好的,我已經在oracle中編寫了一個基本函數來根據客戶端ID和指定的日期返回當前的worker。Oracle SQL函數參數的多個輸入

它按預期工作。

FUNCTION get_worker_new_test (p_id IN VARCHAR2, p_date IN DATE, w_type IN 
VARCHAR2)  RETURN VARCHAR2 IS 

CURSOR c1 IS 

SELECT 
O_RELATIONSHIPS.ID 

FROM o_relationships 
WHERE rel_source_per_gro_id = p_id 
AND rel_rty_code in (w_type) 
AND p_date BETWEEN rel_start_date AND NVL(rel_end_date, SYSDATE) 
ORDER BY rel_start_date DESC; 


l_name VARCHAR2(70) ; 

BEGIN 
OPEN c1; 
FETCH c1 INTO l_name; 
CLOSE c1; 

RETURN l_name; 

END; 

因此,舉例來說,像這樣的查詢:

SELECT 
CLIENT, 
get_worker_new_test(CLIENT,sysdate,'WORKER') 
FROM TABLE 

將返回類似:

客戶端1 |一個工人

但是,我想知道是否有可能要求函數返回來自許多不同的工人類型的最新工人。

因此,例如,我會寫這樣的查詢:

SELECT 
CLIENT, 
get_worker_new_test(CLIENT,sysdate,'WORKER,CLERK,MANAGER') 
FROM TABLE 

而且,它還將返回:

客戶端1 |經理人

如果分配的最新員工類型是經理。我想我需要一個將字符串拆分爲單獨條目的函數,但即使如此,我也不確定是否有更好的方法來處理它。任何意見或指導將不勝感激。

謝謝。

+1

爲什麼需要一個功能呢?當你需要加入時,爲什麼不加入?不是那些簡單地隱藏SQL查詢的功能粉絲。一個問題是你面對的是什麼,你總是需要考慮用戶謂詞的不斷增長的可能性,並堅持你的功能。我不會觸及性能問題 – tbone

+0

我通常會使用連接,但我發現這是我不斷在我的報告中使用的信息。該功能適用​​於我和其他同事,用戶無法訪問它們。 - 如果除了函數之外還有其他建議,我很樂意聽到他們的消息,但是我寫的大概90%的報告通常都需要某種類型的工作者信息(工人,評論員,同事等) 。 – bawpie

+0

[動態SQL](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/dynamic.htm) – GriffeyDog

回答

1

快速和骯髒的解決方案#1。在你的函數使用一個查詢:

SELECT 
O_RELATIONSHIPS.ID 

FROM o_relationships 
WHERE rel_source_per_gro_id = p_id 
AND instr(','||w_type||',', ','||rel_rty_code||',') <> 0 --<-- Check comma-quoted worker type to be substring of parameter string 
AND p_date BETWEEN rel_start_date AND NVL(rel_end_date, SYSDATE) 
ORDER BY rel_start_date DESC; 

快速和骯髒的解決方案#2。創建SQL型:

create type uservchartab as table of varchar2(4000); 

與此代碼替換您的函數:

FUNCTION get_worker_new_test 
    (p_id IN VARCHAR2, p_date IN DATE, w_type IN uservchartab) 
    RETURN VARCHAR2 
IS 

    CURSOR c1 IS 
    SELECT O_RELATIONSHIPS.ID 
     FROM o_relationships 
     WHERE rel_source_per_gro_id = p_id 
     AND rel_rty_code member of w_type --<-- Check worker type to be one from the condition 
     AND p_date BETWEEN rel_start_date AND NVL(rel_end_date, SYSDATE) 
     ORDER BY rel_start_date DESC; 

    l_name VARCHAR2(70) ; 

BEGIN 
    OPEN c1; 
    FETCH c1 INTO l_name; 
    CLOSE c1; 

    RETURN l_name; 
END; 

使用方法如下:

SELECT CLIENT 
    , get_worker_new_test(CLIENT, sysdate, uservchartab('WORKER', 'CLERK', 'MANAGER')) 
    FROM TABLE 
+0

感謝你們,我參加了QaD解決方案#2,它正在做我所需要的至。謝謝。 – bawpie