我有一个存储过程,我想在其中显示一行
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,它应该显示一条记录。
我想要的是,对于一个通过的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