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