2017-06-17 156 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。 –

相关问题