2017-06-17 2 views
0

Ich habe eine Tabelle mit 4 Coulmens und eine gespeicherte Prozedur thet aus dieser Tabelle auswählen. DOC_ID; CUSTOMER_TYPE_ID; CATEGORY_ID; REQUIERD_STATUS; Bisher war die Auswahl preaty einfach, indem Sie die params von customerId vorbei und die categoryCode wir die docId bekam und die requierdStatusSo wählen Sie aus der gleichen Tabelle 2 diffrent Bedingung in der gleichen Auswahl (Oracle gespeicherte Prozedur)

Jetzt i eine weitere Spalte „ACTIVITY_ID“ (nullable) hinzufügen möchten, die einen ein Aktivitätscode so setzen wir könnte spezifischer sein. BEISPIEL: bisher custTypeId = 1 und CategoryCode = 2 hat mich 2 Reihen custTypeId = 1, DocId = 1, requierdStatus = 3, CategoryCode = 2 custTypeId = 1, DocId = 2, requierdStatus = 3, CategoryCode = 2

Durch das Hinzufügen der activityCode coulmn wir den requierd Status wie diese DocId = 1, requierdStatus = 3, CategoryCode = 2, ActivityId = null DocId = 1, requierdStatus = 4, CategoryCode = 2, ActivityId = kontrollieren wollen 10

Wenn das Dokument keinen spezifischen activityCode hat, dann sollte es nach der Kategorie ausgewählt werden.

In meiner Auswahl muss ich in der Lage sein, die durch die ActivityId auswählen, aber wenn keine Zeile antwnt auf diese Bedingung, dann möchte ich die Zeile nach Kategorie erhalten. Was nicht passieren kann ist, dass ich beide Zeilen, eine Zeile nach Aktivität und eine andere nach der Kategorie bekommen werde.

Ich sollte nur eine Zeile oder Null erhalten.

Wie kann ich das tun?

Danke.

Antwort

0

Wenn ich verstehe, was Sie tun, Sie scheinen zu wollen:

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; 

wo p_customer_type_id, p_category_id und p_activity_id die Parameter für die Prozedur sind. Das heißt, dass Sie nur auf die Suche nach Kategorie zurückgreifen möchten, wenn die Aktivitäts-ID der Tabelle null ist, was ich denke, was Sie beschreiben. Und dass der Wert, der in das Verfahren einfließt, nicht null ist; wenn es dann sein kann, macht es das nur ein bisschen komplizierter.

Read more about the keep dense_rank first construct. Grundsätzlich wird festgelegt, welche einzelne Zeile innerhalb der gruppierten Daten in der Ergebnismenge enthalten ist.

Schnell Demo Ihre Beispieldaten (wenn ich richtig interpretiert habe ...):

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); 

Als Prozedur mit einem Aus.Anf Cursor Argument:

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; 
/

Dann testen es:

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

Im immer noch mehr als eine Zeile, die Zeile mit der actividyId und die zweite mit der Null. –

+0

mybe ich kann die Ergebnisse nicht filtern wie? also lösche ich die reihe, die ich nicht von dem ous cursor brauche? –

+0

@dor_dru - OK, aktualisiert, um nur eine Zeile in der Ergebnismenge zu behalten. –

0

Nach dem Verständnis Ihres Problems unter Lösung könnte Ihnen helfen.

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

Nur für Ihre Referenz können Sie If-Bedingung hinzufügen und zwei separate Abfragen schreiben. –

+0

Die Frage ist mit Oracle markiert, daher ist dieses Symtax ​​nicht gültig. Ich bin mir nicht sicher, ob die Logik richtig ist, aber könnte es nur anders interpretieren. –

+0

Im immer noch mehr als eine Zeile, die Zeile mit der actividyId und die zweite mit der Null. –

Verwandte Themen