Oracle 过程在给定过程中未按预期工作

问题描述 投票:0回答:1

我有一个存储过程,我想在其中显示一行

FSA_ID
。但在我的程序中,它为
PSPANINFODATA
光标显示 2 行或更多行。附上图片供参考。

下面也是相同的存储过程

PROCEDURE GET_FTTXDATA_SPAN_AR_FSAID_FE(
    PFSA_ID IN NVARCHAR2,
    PSPANINFODATA OUT SYS_REFCURSOR,
    PSPAN_AER_DATA OUT SYS_REFCURSOR,
    PSVENDORINFO OUT SYS_REFCURSOR,
    PSPANHISTORYINFODATA OUT SYS_REFCURSOR,
    PPROGRESSDATA OUT SYS_REFCURSOR )
AS
  VAR_Partial_QTY        NUMBER;
  VAR_cnt_Partial_QTY    NUMBER;
  VAR_APP_UG_ITR_QTY     NUMBER;
  VAR_APP_AR_ITR_QTY     NUMBER;
  VJOB_ID                NUMBER;
  VAR_APPRV_TOTAL_LENGTH NUMBER;
  VAR_FRESH_FSA_JOB      NUMBER;
  VAR_FRESH_FSA_PROG     NUMBER;
BEGIN
  VAR_APP_UG_ITR_QTY     :=0;
  VAR_APP_AR_ITR_QTY     :=0;
  VJOB_ID                := 0;
  VAR_APPRV_TOTAL_LENGTH :=0;
  VAR_FRESH_FSA_JOB      :=0;
  VAR_FRESH_FSA_PROG     :=0;
  DELETE FROM FIP_FTTX_SPAN_MDU_GTT ;
  COMMIT;
  INSERT
  INTO FIP_FTTX_SPAN_MDU_GTT
    (
      FSA_ID,
      CALCULATED_LENGTH,
      SPAN_REF_NAME,
      SPAN_NAME
    )
  SELECT RJ_FSA_ID AS FSA_ID,
    CALCULATED_LENGTH,
    SPAN_REF_NAME,
    SPAN_NAME
  FROM NE.MV_SPAN@NE
  WHERE RJ_FSA_ID           = PFSA_ID
  AND INVENTORY_STATUS_CODE = 'IPL';
  -- SELECT COUNT(1) INTO VAR_cnt_Partial_QTY from TBL_FIBER_INV_JOBS where FSA_ID= PFSA_ID and job_flag=1; -- earler 0
  SELECT COUNT(1)
  INTO VAR_cnt_Partial_QTY
  FROM TBL_FIBER_INV_JOBS AA
  INNER JOIN TBL_FIBER_INV_JOB_PROGRESS BB
  ON AA.JOB_ID             = BB.JOB_ID
  WHERE AA.FSA_ID          = PFSA_ID
  AND BB.JOB_PROGRESS_FLAG = 1
  AND AA.JOB_FLAG          = 0;
  SELECT COUNT(1)
  INTO VAR_FRESH_FSA_JOB
  FROM TBL_FIBER_INV_JOBS AA
  WHERE AA.FSA_ID        = PFSA_ID
  AND AA.JOB_FLAG        = 1;
  IF VAR_cnt_Partial_QTY > 0 THEN
    /*Select NVL(FSA_MDU,0) as FSA_MDU ,NVL(FSA_UG,0)as FSA_UG,NVL(FSA_AERIAL,0)as FSA_AERIAL
    INTO VAR_Partial_QTY,VAR_APP_UG_ITR_QTY ,VAR_APP_AR_ITR_QTY from TBL_FIBER_INV_JOBS
    where FSA_ID= PFSA_ID and job_flag=1;   */
    -- By Atul
    SELECT AA.JOB_ID
    INTO VJOB_ID
    FROM TBL_FIBER_INV_JOBS AA
    INNER JOIN TBL_FIBER_INV_JOB_PROGRESS BB
    ON AA.JOB_ID          = BB.JOB_ID
    WHERE AA.FSA_ID       = PFSA_ID
    AND JOB_PROGRESS_FLAG = 1
    AND AA.JOB_FLAG       = 0;
    SELECT SUM(BB.FSA_UG_ACTUAL),
      SUM(BB.FSA_AERIAL_ACTUAL) --  sum(BB.FSA_MDU_ACTUAL),
      --BB.FSA_MDU_ACTUAL, BB.FSA_UG_ACTUAL, BB.FSA_AERIAL_ACTUAL
    INTO VAR_APP_UG_ITR_QTY ,
      VAR_APP_AR_ITR_QTY -- VAR_Partial_QTY,
    FROM TBL_FIBER_INV_JOBS AA
    INNER JOIN TBL_FIBER_INV_JOB_PROGRESS BB
    ON AA.JOB_ID             = BB.JOB_ID
    WHERE AA.FSA_ID          = PFSA_ID
    AND BB.JOB_PROGRESS_FLAG = 1
    GROUP BY AA.FSA_ID;
    SELECT BB.FSA_MDU_ACTUAL
    INTO VAR_Partial_QTY
      /* for partial mdu */
    FROM TBL_FIBER_INV_JOBS AA
    INNER JOIN TBL_FIBER_INV_JOB_PROGRESS BB
    ON AA.JOB_ID               = BB.JOB_ID
    WHERE BB.JOB_PROGRESS_FLAG = 1
    AND BB.JOB_ID              = VJOB_ID;
    DBMS_OUTPUT.PUT_LINE('VAR_Partial_QTY' || VAR_Partial_QTY);
  ELSE
    IF VAR_FRESH_FSA_JOB > 0 THEN
      SELECT SUM(BB.FSA_MDU_ACTUAL) ,
        SUM(BB.FSA_UG_ACTUAL) ,
        SUM(BB.FSA_AERIAL_ACTUAL)
      INTO VAR_Partial_QTY,
        VAR_APP_UG_ITR_QTY ,
        VAR_APP_AR_ITR_QTY
      FROM TBL_FIBER_INV_JOBS AA
      INNER JOIN TBL_FIBER_INV_JOB_PROGRESS BB
      ON AA.JOB_ID          = BB.JOB_ID
      WHERE AA.FSA_ID       = PFSA_ID
      AND JOB_PROGRESS_FLAG = 1
      GROUP BY AA.FSA_ID;
    ELSE
      VAR_Partial_QTY:=0;
    END IF;
  END IF;
  OPEN PSPANINFODATA FOR
WITH CTE_FMDU AS
  (SELECT FSA_ID,no_of_floors,
   ROUND(SUM(NO_OF_FLOORS*3/1000), 4) AS FSA_MDU
  FROM FTTX_MDU_BLDG_EQP_DATA bb
  WHERE FSA_ID         = PFSA_ID
  AND bb.fttx_rfs     IN ('S2_RFS', 'OTB_RFS')
  --AND bb.no_of_floors >= 6
  GROUP BY FSA_ID, no_of_floors
  )
SELECT FSMU_GTT.FSA_ID,
  NVL(ROUND(SUM(
  CASE
    WHEN SPAN_REF_NAME    IN ('3x40-F-RG-ST-1L','2x40-F-G-ST-1L','1x40-F-G-ST-1L','2x40-F-RG-ST-1L','7x14MM-MICRO','1x14MM-MICRO','3x40-F-G-ST-1L','2x14MM-MICRO','1x40-F-1L-RED','4x40-F-RG-ST-1L')
    THEN NVL(CALCULATED_LENGTH,0)/1000
  END),4),0)                     - VAR_APP_UG_ITR_QTY AS UG_LENGTH,
  --NVL(CTE_FMDU.FSA_MDU-VAR_Partial_QTY,0) as FSA_MDU,
  -- NVL((CTE_FMDU.FSA_MDU + CTE_FMDU.FSA_MDU*20/100),0) - VAR_Partial_QTY as FSA_MDU,
  CASE
    WHEN (VAR_Partial_QTY=0 and CTE_FMDU.no_of_floors >=6)
    THEN (FSA_MDU)
    WHEN (VAR_Partial_QTY=0 and CTE_FMDU.no_of_floors <=5) THEN 0 
    WHEN (VAR_Partial_QTY > 0 and CTE_FMDU.no_of_floors <=5) THEN 0 
    ELSE ROUND(NVL((CTE_FMDU.FSA_MDU + CTE_FMDU.FSA_MDU * 20 /100),0),4) - VAR_Partial_QTY
  END AS FSA_MDU,
  MIN(FT.MODIFIEDDATE) OFFER_DATE
FROM FIP_FTTX_SPAN_MDU_GTT FSMU_GTT
INNER JOIN app_fttx.Fttx_Taskmaster FT
ON FSMU_GTT.SPAN_NAME = FT.taskid
AND FT.STATUS         ='ACCEPTED'
--INNER JOIN CTE_FMDU
LEFT JOIN CTE_FMDU
ON FSMU_GTT.FSA_ID=CTE_FMDU.FSA_ID
GROUP BY FSMU_GTT.FSA_ID,
  FSA_MDU,no_of_floors;
  
dbms_output.put_line( 'PartialQty ' || VAR_Partial_QTY);
OPEN PSPAN_AER_DATA FOR SELECT FSMU_GTT.FSA_ID,
NVL(ROUND(SUM
(
  CASE
  WHEN SPAN_REF_NAME NOT IN ('3x40-F-RG-ST-1L','2x40-F-G-ST-1L','1x40-F-G-ST-1L','2x40-F-RG-ST-1L','7x14MM-MICRO','1x14MM-MICRO','3x40-F-G-ST-1L','2x14MM-MICRO','1x40-F-1L-RED','4x40-F-RG-ST-1L') THEN
    NVL(CALCULATED_LENGTH,0)/1000
  END),4),0)                - VAR_APP_AR_ITR_QTY
AS
  AR_LENGTH FROM FIP_FTTX_SPAN_MDU_GTT FSMU_GTT GROUP BY FSMU_GTT.FSA_ID;
  IF VAR_cnt_Partial_QTY > 0 THEN
    SELECT AA.JOB_ID
    INTO VJOB_ID
    FROM TBL_FIBER_INV_JOBS AA
    INNER JOIN TBL_FIBER_INV_JOB_PROGRESS BB
    ON AA.JOB_ID          = BB.JOB_ID
    WHERE AA.FSA_ID       = PFSA_ID
    AND JOB_PROGRESS_FLAG = 1
    AND AA.JOB_FLAG       = 0;
  ELSE
    VJOB_ID:=0;
  END IF;
  IF VJOB_ID > 0 THEN
    OPEN PSVENDORINFO FOR SELECT VI.SP_VENDOR_ID,
    VM.VENDORCODE,
    VM.VENDORNAME,
    VI.SP_VENDOR_START_DATE,
    VI.SP_VENDOR_END_DATE FROM TBL_FIBER_INV_VENDORINFO VI INNER JOIN TBL_FIBER_INV_VENDORMAST VM ON VI.SP_VENDOR_CODE = VM.VENDORCODE WHERE VI.JOB_ID = VJOB_ID;
  END IF;
  IF VJOB_ID > 0 THEN
    OPEN PSPANHISTORYINFODATA FOR
  WITH HISTDATA AS
    (SELECT JBPH.UMS_GROUP_ASS_BY_NAME AS GROUP_NAME,
      JBPH.MODIFIED_BY,
      --JBPH.MODIFIED_DATE AS MODIFIED_DATE,
      CASE
        WHEN JBPH.APPROVED_DATE IS NOT NULL
        THEN JBPH.APPROVED_DATE
        ELSE JBPH.REJECTED_DATE
      END AS APPROVE_REJ_DATE,
      CASE
        WHEN JBPH.APPROVED_DATE IS NOT NULL
        THEN 'Approved'
        WHEN JBPH.REJECTED_DATE IS NOT NULL
        THEN 'Rejected'
        ELSE ''
      END AS APPROVE_REJ_STATUS,
      JBPH.APPROV_REJECT_REMARK
    FROM TBL_FIBER_INV_JOB_PROGRESS_H JBPH
    WHERE JBPH.JOB_ID               = VJOB_ID
    AND JBPH.UMS_GROUP_ASS_BY_NAME IS NOT NULL
    AND JBPH.UMS_GROUP_ASS_TO_NAME IS NOT NULL
    ORDER BY JBPH.MODIFIED_DATE DESC
    )
  SELECT HD.GROUP_NAME,
    HD.MODIFIED_BY,
    -- HD.MODIFIED_DATE,
    MAX(TO_CHAR(HD.APPROVE_REJ_DATE,'DD-MM-YYYY HH24:MI:SS')) AS APPROVE_REJ_DATE,
    HD.APPROVE_REJ_STATUS,
    HD.APPROV_REJECT_REMARK
  FROM HISTDATA HD
  WHERE APPROVE_REJ_DATE IS NOT NULL
  GROUP BY HD.GROUP_NAME,
    HD.MODIFIED_BY,
    HD.APPROVE_REJ_STATUS,
    HD.APPROV_REJECT_REMARK
  ORDER BY to_date(APPROVE_REJ_DATE,'DD-MM-YYYY HH24:MI:SS') DESC;
ELSE
  VJOB_ID :=0;
END IF;
IF VJOB_ID > 0 THEN
  OPEN PPROGRESSDATA FOR SELECT FSA_UG_ACTUAL,
  FSA_AERIAL_ACTUAL,
  FSA_MDU_ACTUAL,
  JOB_PROGRESS_ID FROM TBL_FIBER_INV_JOB_PROGRESS WHERE JOB_ID = VJOB_ID AND JOB_PROGRESS_FLAG = 1;
ELSE
  VJOB_ID :=0;
END IF;
END;

我想要的是,对于一个通过的FSAID,它应该显示一条记录。

oracle stored-procedures
1个回答
0
投票

我想要的是,对于一个通过的FSAID,它应该显示一条记录。

您还没有解释要实现的逻辑,但返回单行的最简单方法是添加:

WHERE ROWNUM = 1

这将返回查询生成的第一行(没有

ORDER BY
子句的结果集具有不确定的顺序,因此这可能会给您一个随机行)。

如果您想要基于特定顺序的行,则:

SELECT all_columns_from_your_query
FROM   (
  SELECT all_columns_from_your_query
  FROM   your_query
  ORDER BY something
)
WHERE  ROWNUM = 1

或者,来自 Oracle 12:

ORDER BY something
FETCH FIRST ROW ONLY

这都会返回具有最低

something
的行。


如果您可以有多个

FSAID
那么您可以使用
ROW_NUMBER
分析函数:

SELECT all_columns_from_your_query
FROM   (
  SELECT all_columns_from_your_query,
         ROW_NUMBER() OVER (PARTITION BY fsaid ORDER BY something) AS rn
  FROM   your_query
)
WHERE  rn = 1
© www.soinside.com 2019 - 2024. All rights reserved.