首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >甲骨文11x新手-简单,但真诚.

甲骨文11x新手-简单,但真诚.
EN

Stack Overflow用户
提问于 2016-07-05 17:37:29
回答 2查看 52关注 0票数 0

首先,感谢您花时间阅读这篇文章,我对MSSQL的大多数版本都相当熟悉,但对Oracle和PL SQL的了解却不多。

我的问题和问题是:我在MSSQK2k12中有一个SSRS报告,它在Oracle11xdb上调用存储的proc。在where子句中传递了几个参数,我需要在where子句中再添加一个param (一个简单的Y/N),它将为where子句添加额外的过滤器,在报告提示下有效地说‘您想看到所有的部件吗?(Y/N)。'Y’回答将使proc几乎完全打开,包括没有库存的部件,手头上的部件,但是已经售出了,部件不再活跃。一个'N‘响应将通过过滤器,需要可用的库存,有效的当前零件类,等等。我已经尝试了一个看似不错的解决方案,但没有任何效果。我问过一位同事(他很精通PLSQL),他的建议,他由此产生的“解码”添加没有任何作用。我想寻求不需要几个月学习的建议/帮助,因为我只有几天的时间来完成。请注意,原来的SP不是我的作品,我继承的前任会做/不能完成。附附的存储过程(擦洗)

代码语言:javascript
复制
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;
/
EN

回答 2

Stack Overflow用户

发布于 2016-07-05 17:49:30

你必须使用UNION而不是解码。在UNION的一边,您必须使用外部联接处理参数Y,而其他参数将像您已经编码的那样。

或者您需要使用PLSQL的if / can,因为用户只能将其中一个作为参数传递。

老实说,这个问题并不是甲骨文特有的,仅仅是SQL。

票数 1
EN

Stack Overflow用户

发布于 2016-07-05 17:52:34

因此,对于union或union解决方案,可能如下所示

代码语言:javascript
复制
/* 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'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38209437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档