Search code examples
sqloracle-databasestored-procedures

Update not working properly in Oracle procedure


I have written an Oracle procedure if count is greater than 0 then update the table, but what is happening is it's updating all the records of the table with that one record.

Here is the query

SELECT COUNT(*) INTO T_CNT_1 FROM IPCOLO_BILLING_MASTER WHERE SAP_ID = P_SAP_ID;
        IF T_CNT_1 > 0 THEN
        
                UPDATE IPCOLO_BILLING_MASTER t1
   SET (ID                                      ,
    CMP                                     ,
    SAP_ID                                  ,
    ID_OD_COUNTCHANGE                       ,
    ID_OD_CHANGEDDATE                       ,
    RRH_COUNTCHANGE                         ,
    RRH_CHANGEDDATE                         ,
    TENANCY_COUNTCHANGE                     ,
    TENANCY_CHANGEDDATE                     ,
    RFS_DATE                                ,
    RFE1_DATE                               ,
    INFRA_PROVIDER                          ,
    IP_COLO_SITEID                          ,
    SITE_NAME                               ,
    R4GSTATE                                ,
    MW_INSTALLED                            ,
    DG_NONDG                                ,
    EB_NONEB                                ,
    TOWER_TYPE                              ,
    VENDOR_CODE                             ,
    RFCDATE                                 ,
    POLITICAL_STATE_NAME                    ,
    POLITICAL_STATE_CODE                    ,
    SITE_DROP_DATE                          ,
    CITY_NAME                               ,
    NEID                                    ,
    FACILITY_LATITUDE                       ,
    FACILITY_LONGITUDE                      ,
    RJ_STRUCTURE_TYPE                       ,
    RJ_JC_NAME                              ,
    RJ_JC_CODE                              ,
    COMPANY_CODE                            ,
    BLCHAIN_RESP_MSG_MASTER                 ,
    BLCHAIN_RESP_CODE_MASTER                ,
    SITE_ADDRESS                            ,
    BLCHAIN_RESP_MSG_INCREMENTAL            ,
    BLCHAIN_RESP_CODE_INCREMENTAL           ,
    CREATED_BY                              ,
    CREATED_DATE                            ,
    SEL_CHANGED_VAL                         ,
    CMM                                     ,
    FCA                                     ,
    LAST_UPDATED_BY                         ,
    LAST_UPDATED_DATE                       ,
    IS_AUTO_UPDATED                         ,
    INITIATED_MANUAL_UPLOAD                 ,
    RFS_DATE_5G                             ,
    DROP_DATE_5G                            ,
    OLT_COUNT                               ,
    OLT_CHANGE_DATE                         ,
    DIESEL_DOWNTIME_MINUTES                 ,
    OVERALL_INFRA_OUTAGE_MINUTES            ,
    DIESEL_DOWNTIME_MIN_MY                  ,
    OVERALL_INFRA_OUTAGE_MIN_MY             ,
    BK_RESPONSE_DATE                        ,
    IS5GPRESENT) = (SELECT t2.ID                                        ,
t2.CMP                                     ,
t2.SAP_ID                                  ,
t2.ID_OD_COUNTCHANGE                       ,
t2.ID_OD_CHANGEDDATE                       ,
t2.RRH_COUNTCHANGE                         ,
t2.RRH_CHANGEDDATE                         ,
t2.TENANCY_COUNTCHANGE                     ,
t2.TENANCY_CHANGEDDATE                     ,
t2.RFS_DATE                                ,
t2.RFE1_DATE                               ,
t2.INFRA_PROVIDER                          ,
t2.IP_COLO_SITEID                          ,
t2.SITE_NAME                               ,
t2.R4GSTATE                                ,
t2.MW_INSTALLED                            ,
t2.DG_NONDG                                ,
t2.EB_NONEB                                ,
t2.TOWER_TYPE                              ,
t2.VENDOR_CODE                             ,
t2.RFCDATE                                 ,
t2.POLITICAL_STATE_NAME                    ,
t2.POLITICAL_STATE_CODE                    ,
t2.SITE_DROP_DATE                          ,
t2.CITY_NAME                               ,
t2.NEID                                    ,
t2.FACILITY_LATITUDE                       ,
t2.FACILITY_LONGITUDE                      ,
t2.RJ_STRUCTURE_TYPE                       ,
t2.RJ_JC_NAME                              ,
t2.RJ_JC_CODE                              ,
t2.COMPANY_CODE                            ,
t2.BLCHAIN_RESP_MSG_MASTER                 ,
t2.BLCHAIN_RESP_CODE_MASTER                ,
t2.SITE_ADDRESS                            ,
t2.BLCHAIN_RESP_MSG_INCREMENTAL            ,
t2.BLCHAIN_RESP_CODE_INCREMENTAL           ,
t2.CREATED_BY                              ,
t2.CREATED_DATE                            ,
t2.SEL_CHANGED_VAL                         ,
t2.CMM                                     ,
t2.FCA                                     ,
t2.LAST_UPDATED_BY                         ,
SYSDATE,
--t2.LAST_UPDATED_DATE                       ,
t2.IS_AUTO_UPDATED                         ,
t2.INITIATED_MANUAL_UPLOAD                 ,
t2.RFS_DATE_5G                             ,
t2.DROP_DATE_5G                         ,
t2.OLT_COUNT                               ,
t2.OLT_CHANGE_DATE                         ,
t2.DIESEL_DOWNTIME_MINUTES                 ,
t2.OVERALL_INFRA_OUTAGE_MINUTES            ,
t2.DIESEL_DOWNTIME_MIN_MY                  ,
t2.OVERALL_INFRA_OUTAGE_MIN_MY             ,
t2.BK_RESPONSE_DATE                     ,
t2.IS5GPRESENT
                         FROM TEMP_IPCOLO_BILLING_MST t2
                        WHERE   t2.SAP_ID = P_SAP_ID  
                            )
 WHERE EXISTS (
    SELECT 1
      FROM TEMP_IPCOLO_BILLING_MST t2
     WHERE  t2.SAP_ID = P_SAP_ID );

Why is it updating all and I want to update that one single row only?


Solution

  • Well, the only condition you have on the update is

    WHERE EXISTS (
        SELECT 1
          FROM TEMP_IPCOLO_BILLING_MST t2
         WHERE  t2.SAP_ID = P_SAP_ID );
    

    So you're telling Oracle that you want every row in IPCOLO_BILLING_MASTER updated if there is any row in TEMP_IPCOLO_BILLING_MST with a SAP_ID of P_SAP_ID. Presumably, that is not what you actually want.

    Since IPCOLO_BILLING_MASTER has a SAP_ID, my guess is that you want

    WHERE EXISTS (
        SELECT 1
          FROM TEMP_IPCOLO_BILLING_MST t2
         WHERE  t2.SAP_ID = P_SAP_ID 
           AND  t2.SAP_ID = t1.SAP_ID );
    

    Presumably, you'd want similar logic in the SELECT statement you are using to get the values to update the table.

    It may be clearer to re-write the update statement as a merge so that you don't have to duplicate this logic in two places.

    If my guess is incorrect, please edit your question to include a reproducible test case. You aren't very specific about what you do want to happen so we have to make a lot of guesses about what your data looks like and what you really want your update statement to do.