CREATE OR REPLACE PROCEDURE FCT_UPD_NOME_PRODUTO_OM (
    P_IDELEMENTO IN FCT_SERVICOORCA.IDELEMENTO%TYPE,
    P_NMSERVORCA IN FCT_SERVICOORCA.NMSERVORCA%TYPE
)
AS
    V_IDTIPOELEMENTO     FCT_SERVICOORCA.IDTIPOELEMENTO%TYPE;
    V_IDPRODUTO          NUMBER;
    V_IDELEMENTO_PRODUTO FCT_SERVICOORCA.IDELEMENTO%TYPE;
    V_UNIQUEID           VARCHAR2(2000);
BEGIN

    SELECT IDTIPOELEMENTO
      INTO V_IDTIPOELEMENTO
      FROM FCT_SERVICOORCA
     WHERE IDELEMENTO = P_IDELEMENTO;
    
    IF (V_IDTIPOELEMENTO = 'P') THEN

        V_IDPRODUTO := TO_NUMBER(REPLACE(P_IDELEMENTO, 'P_', ''));

        UPDATE OM_PRODUTO
           SET NMPRODUTO = P_NMSERVORCA
         WHERE ID = V_IDPRODUTO;

    ELSIF (V_IDTIPOELEMENTO = 'M') THEN

        BEGIN
            SELECT IDELEMENTO
              INTO V_IDELEMENTO_PRODUTO
              FROM FCT_SERVICOORCA
             WHERE IDTIPOELEMENTO = 'P'
           CONNECT BY PRIOR IDELEMENTOPAI = IDELEMENTO
             START WITH IDELEMENTO = P_IDELEMENTO;
        EXCEPTION WHEN NO_DATA_FOUND THEN
            V_IDELEMENTO_PRODUTO := NULL;
        END;

        IF (V_IDELEMENTO_PRODUTO IS NOT NULL) THEN

            V_IDPRODUTO := TO_NUMBER(REPLACE(V_IDELEMENTO_PRODUTO, 'P_', ''));
            V_UNIQUEID := REPLACE(P_IDELEMENTO, V_IDELEMENTO_PRODUTO || '_M_', '');

            UPDATE OM_PRODUTO_ELEMENTO
               SET LABEL = P_NMSERVORCA
             WHERE NRPRODUTO_ID = V_IDPRODUTO
               AND UNIQUE_ID    = V_UNIQUEID;

        END IF;

    END IF;

END;
/