在oracle中,游标的更新出现错误

在oracle中,游标的更新出现错误,oracle,stored-procedures,cursor,Oracle,Stored Procedures,Cursor,我创建了一个存储过程,其中包含游标。此外,它还根据一些计算更新了2列 以下是程序 根据需要创建或替换程序FIBER_SIGNOFF_UGAR_UPD 开始 目前 选择inv.CIRCLE, regexp_substrMP'[^/]+',1,1MPNAME,regexp_substrMP'[^/]+',1,2MPCODE, 由CMM批准的库存路线作为CMM批准的长度, 库存跨度类型,圆形计算长度,0/1000,4为NE长度, RoundSum当RJ_构造_方法(与“%Aeror%”或RJ_构造_

我创建了一个存储过程,其中包含游标。此外,它还根据一些计算更新了2列

以下是程序

根据需要创建或替换程序FIBER_SIGNOFF_UGAR_UPD 开始 目前 选择inv.CIRCLE, regexp_substrMP'[^/]+',1,1MPNAME,regexp_substrMP'[^/]+',1,2MPCODE, 由CMM批准的库存路线作为CMM批准的长度, 库存跨度类型,圆形计算长度,0/1000,4为NE长度, RoundSum当RJ_构造_方法(与“%Aeror%”或RJ_构造_方法不同)为空时,则为NVLCALCULATED_LENGTH,0否则0结束/1000,4作为UG_LENGTH ,当RJ_构造_方法(如“%天线%”)然后计算_长度,0否则0结束/1000,4作为AR_长度时, RoundSum当RJ_构造_方法与“%Aeror%”或RJ_构造_方法不同时为空,则为NVLCALCULATED_长度,否则为0 END/1000,4/RoundSumNVCalculated_长度,0/1000,4*100为ug_百分比, mv.rj_内城_链路_标识自NE.mv_SPAN@DB_LINK_NE_VIEWERmv 加入TBL\U光纤\U投资\U CMP\U报告\U MV投资 在inv.SPAN_类型=‘城际’和inv.SPAN_链接ID=mv.rj_SPAN_ID上 或inv.SPAN_类型='INTRACITY'和inv.SPAN_LINK_ID=mv.rj_INTRACITY_LINK_ID 或者inv.SPAN\u TYPE=‘企业’和inv.SPAN\u LINK\u ID=mv.rj\u intracity\u LINK\u ID 按mv.rj\U城市内部链接\U id、库存路线\U CMM批准\U、库存跨度\U类型、库存圆圈、库存MP分组 环 开始 更新TBL\U光纤库存签核表集 FSA\u UG=当前CMM\u批准长度*当前百分比/100, FSA\u天线=当前CMM\u批准长度-当前CMM\u批准长度*当前ug\u百分比/100 其中SPAN\u LINK\u ID= 案例电流SPAN\u类型 当“城际”时,则为cur\u r.rj\u span\u id 当为“内部城市”时,则为cur\u r.rj\u内部城市\u链接\u id 当为“企业”时,则为cur\u r.rj\u intracity\u link\u id 终止 终止 端环; 端部光纤信号装置 此端缺少分号:

      END;                    --> here
   END LOOP;
END FIBER_SIGNOFF_UGAR_UPD;
截至无效关系运算符:此案例缺少关系运算符:

它等于什么吗?不同于什么?什么应该是,例如

WHERE CASE cur_r.span_type
           WHEN 'INTERCITY' THEN cur_r.rj_span_id
           WHEN 'INTRACITY' THEN cur_r.rj_intracity_link_id
           WHEN 'ENTERPRISE' THEN cur_r.rj_intracity_link_id
      END = 1
          ---
          This
此端缺少分号:

      END;                    --> here
   END LOOP;
END FIBER_SIGNOFF_UGAR_UPD;
截至无效关系运算符:此案例缺少关系运算符:

它等于什么吗?不同于什么?什么应该是,例如

WHERE CASE cur_r.span_type
           WHEN 'INTERCITY' THEN cur_r.rj_span_id
           WHEN 'INTRACITY' THEN cur_r.rj_intracity_link_id
           WHEN 'ENTERPRISE' THEN cur_r.rj_intracity_link_id
      END = 1
          ---
          This

试试这个,用case语句替换where子句

  CREATE OR REPLACE PROCEDURE FIBER_SIGNOFF_UGAR_UPD AS 
BEGIN

for cur_r in (
                   select inv.CIRCLE, 
                          inv.MP, 
                          inv.ROUTE_APPROVED_BY_CMM as CMM_APPROVED_LENGTH, 
                          inv.SPAN_TYPE,  ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH, 
                          ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS  NULL THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LENGTH
                         ,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LENGTH,
                          ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS  NULL THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4)/ ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4)*100 as ug_percentage,      
                    mv.rj_intracity_link_id  FROM NE.MV_SPAN@DB_LINK_NE_VIEWER mv
                   join TBL_FIBER_INV_CMP_REPORT_MV inv
              on   ((inv.SPAN_TYPE = 'INTERCITY' AND inv.SPAN_LINK_ID = mv.rj_span_id)
                 or (inv.SPAN_TYPE = 'INTRACITY' AND inv.SPAN_LINK_ID = mv.rj_intracity_link_id)
                 or (inv.SPAN_TYPE = 'ENTERPRISE' AND inv.SPAN_LINK_ID = mv.rj_intracity_link_id))
              GROUP BY mv.rj_intracity_link_id, inv.ROUTE_APPROVED_BY_CMM, inv.SPAN_TYPE,inv.CIRCLE, inv.MP
              
              )
              
loop


          begin
          
            update TBL_FIBER_INV_SIGN_OFF_SHEET set
              FSA_UG = cur_r.CMM_APPROVED_LENGTH * cur_r.ug_percentage / 100,
              FSA_AERIAL = cur_r.CMM_APPROVED_LENGTH - (cur_r.CMM_APPROVED_LENGTH * cur_r.ug_percentage / 100)
           WHERE  SPAN_LINK_ID = 
                  CASE  WHEN cur_r.SPAN_TYPE ='INTERCITY' THEN cur_r.rj_span_id
                        WHEN cur_r.SPAN_TYPE IN('INTRACITY','ENTERPRISE') THEN cur_r.rj_intracity_link_id
                  END;     
          
          end;


end loop;


END FIBER_SIGNOFF_UGAR_UPD;

试试这个,用case语句替换where子句

  CREATE OR REPLACE PROCEDURE FIBER_SIGNOFF_UGAR_UPD AS 
BEGIN

for cur_r in (
                   select inv.CIRCLE, 
                          inv.MP, 
                          inv.ROUTE_APPROVED_BY_CMM as CMM_APPROVED_LENGTH, 
                          inv.SPAN_TYPE,  ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH, 
                          ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS  NULL THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LENGTH
                         ,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LENGTH,
                          ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS  NULL THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4)/ ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4)*100 as ug_percentage,      
                    mv.rj_intracity_link_id  FROM NE.MV_SPAN@DB_LINK_NE_VIEWER mv
                   join TBL_FIBER_INV_CMP_REPORT_MV inv
              on   ((inv.SPAN_TYPE = 'INTERCITY' AND inv.SPAN_LINK_ID = mv.rj_span_id)
                 or (inv.SPAN_TYPE = 'INTRACITY' AND inv.SPAN_LINK_ID = mv.rj_intracity_link_id)
                 or (inv.SPAN_TYPE = 'ENTERPRISE' AND inv.SPAN_LINK_ID = mv.rj_intracity_link_id))
              GROUP BY mv.rj_intracity_link_id, inv.ROUTE_APPROVED_BY_CMM, inv.SPAN_TYPE,inv.CIRCLE, inv.MP
              
              )
              
loop


          begin
          
            update TBL_FIBER_INV_SIGN_OFF_SHEET set
              FSA_UG = cur_r.CMM_APPROVED_LENGTH * cur_r.ug_percentage / 100,
              FSA_AERIAL = cur_r.CMM_APPROVED_LENGTH - (cur_r.CMM_APPROVED_LENGTH * cur_r.ug_percentage / 100)
           WHERE  SPAN_LINK_ID = 
                  CASE  WHEN cur_r.SPAN_TYPE ='INTERCITY' THEN cur_r.rj_span_id
                        WHEN cur_r.SPAN_TYPE IN('INTRACITY','ENTERPRISE') THEN cur_r.rj_intracity_link_id
                  END;     
          
          end;


end loop;


END FIBER_SIGNOFF_UGAR_UPD;

补充说,现在得到的错误是Error26,13:PL/SQL:SQL语句忽略了Error33,29:PL/SQL:ORA-00920:invalid relational operator错误案例;我添加了更多信息。看一看。是的,添加了where条件是我的问题。更新了它。补充说,现在得到的错误是Error26,13:PL/SQL:SQL语句忽略了Error33,29:PL/SQL:ORA-00920:invalid relational operator错误案例;我添加了更多信息。看一看。是的,添加了where条件是我的问题。更新它。你可以发布整个答案,因为我得到的问题,现在SQL命令没有正确结束后添加;错误消失了。。所以我唯一的问题是。如果任何条件与该案例匹配,则该案例将用于更新。是吗?根据您的逻辑,但我没有访问表或数据,您已经运行了测试并验证了数据。现在,我在运行该过程后收到了错误,而不是按函数分组。如果需要,我将在将来向您发送消息。您能否在我收到问题时发布整个答案,因为添加后SQL命令未正确结束;错误消失了。。所以我唯一的问题是。如果任何条件与该案例匹配,则该案例将用于更新。是吗?根据您的逻辑,但我没有访问表或数据,您已经运行了测试并验证了数据。现在我得到的错误不是按函数分组,而是在运行该过程后。如果需要,我可以在将来ping u吗?