2017-06-17 162 views
0

我有一個表,其中有4個庫爾蒙和存儲過程,可從該表中選擇。 DOC_ID; CUSTOMER_TYPE_ID; CATEGORY_ID; REQUIERD_STATUS; 直到現在的選擇是preaty簡單,通過傳遞客戶ID的PARAMS和我們得到了的docId和requierdStatus如何從同一表中選擇2個不同的條件在同一個選擇(Oracle存儲過程)

現在,我想補充另一列「ACTIVITY_ID」(可爲空),確立了活動代碼,所以我們的categoryCode可能更具體。 例如:直到現在 custTypeId = 1和CategoryCode = 2 拉去2行 custTypeId = 1,的DocID = 1,requierdStatus = 3,CategoryCode = 2 custTypeId = 1,的DocID = 2,requierdStatus = 3,CategoryCode = 2

通過添加我們想CONTROLL這樣 的DocID = 1,requierdStatus = 3,CategoryCode = 2,ActivityId = NULL 的DocID = 1,requierdStatus = 4,CategoryCode = 2,ActivityId =所述requierd狀態activityCode coulmn 10

Basicly如果文檔可是沒有一個特定的activityCode那麼它應該由類別中selcted。

在我選擇我需要能夠通過ActivityId選擇,但如果沒有行answerd該條件的話,我想按類別獲取該行。 什麼不能發生的是,我會得到兩行,一行按行,另一行按類別。

我應該只得到一行或零。

我該怎麼做?

謝謝。

回答

0

如果我理解你在做什麼,你似乎想:​​

select min(t.doc_id) keep (dense_rank first order by t.activity_id), 
    min(t.required_status) keep (dense_rank first order by t.activity_id) 
into ... -- unless opening a ref cursor 
from your_table t 
where t.customer_type_id = p_customer_type_id 
and (t.activity_id = p_activity_id 
or (t.activity_id is null and t.category_id = p_category_id)) 
group by t.customer_type_id, t.category_id; 

其中p_customer_type_idp_category_idp_activity_id是你的程序的參數。這是假設你只想退回到按類別搜索是表活動ID爲空,我認爲這是你正在描述。並且傳遞給該過程的值也不會爲空;如果可以的話,那會讓它更復雜一點。

Read more about the keep dense_rank first construct.基本上它的確定所述分組的數據內單列被保持在結果集中。

使用您的樣本數據(如果我正確的解釋......)

快速演示:

create table your_table (doc_id number, customer_type_id number, 
    category_id number, required_status number, activity_id number); 

insert into your_table (doc_id, customer_type_id, 
    category_id, required_status, activity_id) 
values (1, 1, 2, 3, null); 

insert into your_table (doc_id, customer_type_id, 
    category_id, required_status, activity_id) 
values (1, 1, 2, 4, 10); 

與一個OUT REF遊標參數的程序:

create or replace procedure your_proc (p_customer_type_id number, 
    p_category_id number, p_activity_id number, p_cursor out sys_refcursor) as 
begin 
    open p_cursor for 
    select min(t.doc_id) keep (dense_rank first order by t.activity_id) as doc_id, 
     min(t.required_status) keep (dense_rank first order by t.activity_id) as required_status 
    from your_table t 
    where t.customer_type_id = p_customer_type_id 
    and (t.activity_id = p_activity_id 
    or (t.activity_id is null and t.category_id = p_category_id)) 
    group by t.customer_type_id, t.category_id; 
end your_proc; 
/

然後測試它:

var rc refcursor; 

begin 
    your_proc (p_customer_type_id => 1, p_category_id => 2, 
    p_activity_id => 10, p_cursor => :rc); 
end; 
/

PL/SQL procedure successfully completed. 

print rc 

    DOC_ID REQUIRED_STATUS 
---------- --------------- 
     1    4 

begin 
    your_proc (p_customer_type_id => 1, p_category_id => 2, 
    p_activity_id => 42, p_cursor => :rc); 
end; 
/

PL/SQL procedure successfully completed. 

print rc 

    DOC_ID REQUIRED_STATUS 
---------- --------------- 
     1    3 
+0

我仍然geting所有更多的一行,行與actividyId和第二個與null。 –

+0

mybe我不能過濾結果一些如何?所以我刪除行我不需要從光標? –

+0

@dor_dru - 確定,更新爲只保留結果集中的一行。 –

0

在瞭解您的問題後,解決方案可能會對您有所幫助。

CREATE PROCEDURE proc_Search 
    @Activity_Id INT NULL, 
    @CustTypeID INT , 
    @CategoryCode INT 
AS 
BEGIN 
SELECT DOC_ID, CUSTOMER_TYPE_ID,CATEGORY_ID, REQUIERD_STATUS 
FROM myTable 
WHERE @Activity_ID IS NULL OR (Activity_ID = @Activity_ID) 
AND CATEGORY_ID = @CategoryCode 

END 
+0

僅供參考,您可以添加If條件以及編寫兩個單獨的查詢。 –

+0

問題標記爲Oracle,所以此symtax​​無效。我不確定邏輯是否正確,但可能只是以不同的方式解釋。 –

+0

我仍然geting所有更多的一行,行與actividyId和第二個與null。 –

相關問題