2016-07-05 6 views
0

Zuerst, danke, dass Sie sich die Zeit genommen haben, dies zu lesen, ich bin ziemlich gut mit den meisten Versionen von MSSQL, aber nicht so viel mit Oracle und PL SQL.Oracle 11x Newbie - einfach, aber aufrichtig ...

Mein Problem und Frage sind dies: Ich habe einen SSRS-Bericht in MSSQK2k12, die eine gespeicherte Proc auf einem Oracle 11x db aufruft. Es gibt mehrere übergebene Parameter, die in der where-Klausel verwendet werden. Ich muss einen weiteren param (ein einfaches Y/N) hinzufügen, der der where-Klausel zusätzliche Filter hinzufügt und effektiv an der Eingabeaufforderung "Willst du es sehen" sagt alle teile? (J/N). Mit einer 'Y'-Antwort wird der Proc fast weit geöffnet, einschließlich Teilen, die kein Inventar haben, Teile vorhanden, aber bereits verkauft, Teile nicht mehr aktiv. Eine 'N'-Antwort wird Filter passieren, die verfügbares Inventar, gültige aktuelle Teileklasse usw. benötigen. Ich habe ein halbes Dutzend scheinbar gute Lösungen versucht, ohne Erfolg. Ich habe einen Kollegen (der sich mit PLSQL auskennt) nach seinem Rat gefragt, der daraus resultierende Zusatz 'DECODE' hat nichts bewirkt. Ich möchte um Rat/Unterstützung bitten, die keine Monate des Studiums beinhaltet, da ich nur ein paar Tage zu Ende habe. Bitte beachten Sie, der ursprüngliche SP war nicht meine Arbeit, die ich vom Vorgänger geerbt habe/konnte nicht abgeschlossen werden. Stored Procedure (Scrubbed) beigefügt

CREATE OR REPLACE PROCEDURE ORACLE_PROD.RPT_LIKE_PARTS_TEST (
    p_Pos1 IN varchar2 
    , p_Description IN varchar2 
    , p_StartPos IN varchar2 
    , p_StartPosValue IN varchar2 
    , p_ViewAll IN varchar2 --ADDED to allow filtered return for data 
    , p_recordset OUT SYS_REFCURSOR) 
AS 
BEGIN 

OPEN p_recordset FOR 
    SELECT T1.ITEM 
    , T1.REVISION 
    , T1.DESCRIPTION 
    , T2.CCN 
    , T2.DELETED 
    , T2.OBSOLETED 
    , T2.FINGOOD 
    , T2.ABC 
    , T3.MAS_LOC 
    , T3.LOCATION 
    , (T3.OH_QTY - T3.COM_QTY) - T3.RESV_QTY as Avail_QTY 
    , T1.USER_NUM1 
    , case when T2.HALT<>' ' then 'Y' else NULL end as Halt 
    , T4.DESCRIPTION as T4_Description 
    , det.OH_QTY as Det_OH_QTY 
    , det.COM_QTY as Det_COM_QTY 
    , DECODE(det.INSP_STAT,'3','Passed Inpection' ,DECODE det.INSP_STAT,'1','Waiting Inspection' ,' ')) as Inspect_Descr 
    , T3.RESV_QTY 

    from ITEM T1 
    LEFT OUTER JOIN ITEM_CCN T2 
     ON T1.ITEM=T2.ITEM 
     and T1.REVISION=T2.REVISION 
    LEFT OUTER JOIN ITEM_LOC T3 
     on T2.CCN=T3.CCN 
     and T2.ITEM=T3.ITEM 
     and T2.REVISION=T3.REVISION 
    LEFT OUTER JOIN HALT T4 
     on T2.HALT=T4.HALT 
     and T2.CCN=T4.CCN 
    LEFT OUTER JOIN ITEM_DET det 
     on T3.CCN=det.CCN 
     and T3.ITEM=det.ITEM 
     and T3.REVISION=det.REVISION 
     and T3.MAS_LOC=det.MAS_LOC 
     and T3.LOCATION=det.LOCATION 
where T2.OBSOLETED is null 
    --** all commented parts are attempted adds 
    --&&&and CASE (p_ViewAll) 
    --&&& when 'N' 
    --&&& THEN --T2.HALT = DECODE(T2.HALT,'DSGN', 'XXX',' ','XXX',T2.HALT) 
    -- and 
    --&&& (T2.HALT != 'DSGN' and (((T3.OH_QTY - T3.COM_QTY) - T3.RESV_QTY))> 0 
    --and T2.HALT <> 'DSGN' and T3.mas_loc <>'99' and T3.mas_loc <>' ' 

    --&&&WHEN 'Y' 
    --&&& THEN 
    and T2.HALT <>'DSGN' 
    --&&&ELSE NULL-- or T3.mas_loc <> '') 
    --&&&END 
    --** 
     /*and T2.HALT = decode(p_ViewAll,'Y', 
          DECODE(T2.HALT,'DSGN', T2.HALT), 
          DECODE(T2.HALT,'DSGN', T2.HALT)   

          --DECODE(T2.HALT,'DSGN', 'XXX',' ','XXX',T2.HALT), 
          --DECODE(T2.HALT,'DSGN', 'XXX', T2.HALT)        
        ) 
     and (p_ViewAll != 'Y' or T3.mas_loc not in ('99',' '))*/ 
--** 



    AND UPPER(TRIM(T1.ITEM)) LIKE (CASE WHEN LENGTH(TRIM(p_pos1)) > 0 THEN UPPER(TRIM(p_pos1) || '%') ELSE UPPER(TRIM(T1.ITEM))END) 
    AND UPPER(T1.DESCRIPTION) LIKE (CASE WHEN LENGTH(p_Description) > 0 THEN UPPER(('%' || p_Description || '%')) ELSE UPPER(UPPER(T1.DESCRIPTION))END) 
    AND 
      (CASE WHEN TO_NUMBER(NVL(TRIM(p_StartPos),'0')) > 0 THEN SUBSTR(TRIM(T1.ITEM),TO_NUMBER(TRIM(p_StartPos)),NVL(LENGTH(UPPER(TRIM(p_StartPosValue))),'0')) 
        ELSE 'False' 
      END) 

      = 

      (CASE WHEN TO_NUMBER(NVL(TRIM(p_StartPos),'0')) > 0 THEN NVL(UPPER(TRIM(p_StartPosValue)),'') 
        ELSE 'False' 
      END) 
ORDER BY T1.ITEM 
, T1.revision desc 
; 
END RPT_LIKE_PARTS_TEST; 
/
+0

könnten Sie den einfachen Weg und haben nur zwei select-Anweisungen mit einer Vereinigung aller zwischen ihnen. Also auf die Where-Klausel Ihres ersten Kerls, der weit offenen Teil der Where-Klausel läuft und Ihr Indikator = 'Y' und auf der zweiten Abfrage in der Where-Klausel wäre Ihr Indikator = 'N' –

Antwort

1

Sie müssen UNION verwenden und nicht decodieren. Auf einer Seite von UNION müssen Sie den Parameter Y mit Outer Join behandeln und andere werden wie Sie bereits codiert haben.

ODER Sie müssen if/else von PLSQL verwenden, da der Benutzer nur einen von ihnen als Parameter übergeben kann.

Um ehrlich zu sein, ist diese Frage nichts spezifisch für Orakel und bloße SQL.

+0

Vielen Dank für Ihre Antwort Könntest du bitte erklären "Auf einer Seite von UNION musst du Parameter Y mit Outer Join behandeln" ... eine weitere großartige Antwort, die oben gepostet wurde, und wie es ist, funktioniert die Lösung nicht, obwohl es Sinn ergibt .... – Joe

+0

Vielen Dank, dies bot einen wertvollen Einblick in die Art des Problems (neben meinem Mangel an praktischen Erfahrungen), war die endgültige Lösung eine Mischung aus Ihrem Rat und den anderen Rat, der hier angeboten wird. Beides zusammen hat super geklappt. Danke vielmals ! – Joe

1

so mit der Vereinigung aller oder Vereinigung Lösung sieht wahrscheinlich so etwas wie dieses

/* Formatted on 7/5/2016 1:50:34 PM (QP5 v5.256.13226.35510) */ 
SELECT T1.ITEM, 
     T1.REVISION, 
     T1.DESCRIPTION, 
     T2.CCN, 
     T2.DELETED, 
     T2.OBSOLETED, 
     T2.FINGOOD, 
     T2.ABC, 
     T3.MAS_LOC, 
     T3.LOCATION, 
     (T3.OH_QTY - T3.COM_QTY) - T3.RESV_QTY AS Avail_QTY, 
     T1.USER_NUM1, 
     CASE WHEN T2.HALT <> ' ' THEN 'Y' ELSE NULL END AS Halt, 
     T4.DESCRIPTION AS T4_Description, 
     det.OH_QTY AS Det_OH_QTY, 
     det.COM_QTY AS Det_COM_QTY, 
     DECODE (det.INSP_STAT, '3', 'Passed Inpection', DECODE det.INSP_STAT,'1','Waiting Inspection' ,' ')) as Inspect_Descr 
    , T3.RESV_QTY 

    from ITEM T1 
    LEFT OUTER JOIN ITEM_CCN T2 
     ON T1.ITEM=T2.ITEM 
     and T1.REVISION=T2.REVISION 
    LEFT OUTER JOIN ITEM_LOC T3 
     on T2.CCN=T3.CCN 
     and T2.ITEM=T3.ITEM 
     and T2.REVISION=T3.REVISION 
    LEFT OUTER JOIN HALT T4 
     on T2.HALT=T4.HALT 
     and T2.CCN=T4.CCN 
    LEFT OUTER JOIN ITEM_DET det 
     on T3.CCN=det.CCN 
     and T3.ITEM=det.ITEM 
     and T3.REVISION=det.REVISION 
     and T3.MAS_LOC=det.MAS_LOC 
     and T3.LOCATION=det.LOCATION 
where T2.OBSOLETED is null and p_ViewAll = 'Y' 
UNION ALL 

SELECT T1.ITEM 
    , T1.REVISION 
    , T1.DESCRIPTION 
    , T2.CCN 
    , T2.DELETED 
    , T2.OBSOLETED 
    , T2.FINGOOD 
    , T2.ABC 
    , T3.MAS_LOC 
    , T3.LOCATION 
    , (T3.OH_QTY - T3.COM_QTY) - T3.RESV_QTY as Avail_QTY 
    , T1.USER_NUM1 
    , case when T2.HALT<>' ' then 'Y' else NULL end as Halt 
    , T4.DESCRIPTION as T4_Description 
    , det.OH_QTY as Det_OH_QTY 
    , det.COM_QTY as Det_COM_QTY 
    , DECODE(det.INSP_STAT,'3','Passed Inpection' ,DECODE det.INSP_STAT,'1','Waiting Inspection' ,' ')) as Inspect_Descr 
    , T3.RESV_QTY 

    from ITEM T1 
    LEFT OUTER JOIN ITEM_CCN T2 
     ON T1.ITEM=T2.ITEM 
     and T1.REVISION=T2.REVISION 
    LEFT OUTER JOIN ITEM_LOC T3 
     on T2.CCN=T3.CCN 
     and T2.ITEM=T3.ITEM 
     and T2.REVISION=T3.REVISION 
    LEFT OUTER JOIN HALT T4 
     on T2.HALT=T4.HALT 
     and T2.CCN=T4.CCN 
    LEFT OUTER JOIN ITEM_DET det 
     on T3.CCN=det.CCN 
     and T3.ITEM=det.ITEM 
     and T3.REVISION=det.REVISION 
     and T3.MAS_LOC=det.MAS_LOC 
     and T3.LOCATION=det.LOCATION 
where T2.OBSOLETED is null and p_ViewAll = 'N' 
and myfilterstuff = 'whatever' 
+0

Vielen Dank, dies bot einen wertvollen Einblick in die Art des Problems (neben meinem Mangel an praktischen Erfahrungen), war die endgültige Lösung eine Mischung aus Ihrem Rat und den anderen Rat hier angeboten. Beides zusammen hat super geklappt. Danke vielmals ! – Joe