如果我理解你在做什麼,你似乎想:
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 - 確定,更新爲只保留結果集中的一行。 –