如果我理解你在做什么,你似乎想:
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_id
,p_category_id
和p_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
我仍然geting所有更多的一行,行与actividyId和第二个与null。 –
mybe我不能过滤结果一些如何?所以我删除行我不需要从光标? –
@dor_dru - 确定,更新为只保留结果集中的一行。 –