create or replace FUNCTION GET_NRESTRUTURA_SUPERIOR (
   P_NRORG IN NUMBER,
   P_NRESTRUTURA IN NUMBER,
   P_NRTPESTRUTURA_SUP IN NUMBER,
   P_DTVIGENCIA_HIERAR IN DATE)
RETURN NUMBER IS
    V_LEGAL NUMBER;
    V_NRESTRUTURALEGAL NUMBER;
    V_TESTE NUMBER;
	BEGIN
		SELECT COUNT(NRESTRUTURAM)
		  INTO V_TESTE
		  FROM ESTRUTURAM
		 WHERE NRORG = P_NRORG
		   AND NRESTRUTURAM = P_NRESTRUTURA
		   AND NRTIPOESTRUTURA = P_NRTPESTRUTURA_SUP;
		IF V_TESTE > 0 THEN
    	   RETURN P_NRESTRUTURA;
		END IF;
		SELECT
		   CASE WHEN T.NRTIPOESTRUTSUP = P_NRTPESTRUTURA_SUP
		   THEN 1
		   ELSE 0
		   END,
		   H.NRESTRUTURAMSUP
		INTO V_LEGAL,
		     V_NRESTRUTURALEGAL
		FROM HIERARQUIAORG H
		JOIN TIPOHIERARQORG T ON (H.NRTIPOHIERARQORG = T.NRTIPOHIERARQORG)
		WHERE H.NRORG = P_NRORG
		  AND T.NRTIPOESTRUTSUP = P_NRTPESTRUTURA_SUP
		  AND H.NRESTRUTURAMREL = P_NRESTRUTURA
		  AND H.DTINIVIGENCIA = (SELECT MAX(DTINIVIGENCIA)
		                           FROM HIERARQUIAORG
		                          WHERE NRORG = H.NRORG
		                            AND NRESTRUTURAMREL = H.NRESTRUTURAMREL
		                            AND DTINIVIGENCIA <= P_DTVIGENCIA_HIERAR);
		IF V_LEGAL = 0 THEN
		   RETURN GET_NRESTRUTURA_SUPERIOR (P_NRORG, V_NRESTRUTURALEGAL, P_NRTPESTRUTURA_SUP, P_DTVIGENCIA_HIERAR);
		ELSE
		   RETURN V_NRESTRUTURALEGAL;
		END IF;
	EXCEPTION
	WHEN TOO_MANY_ROWS THEN
        RAISE_APPLICATION_ERROR (- 20001, CONCAT ('HIERARQUIAORG TEM ESTRUTURA INVÁLIDA PARA O NRESTRUTURA = ', P_NRESTRUTURA));
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('GET_NRESTRUTURA_SUPERIOR','2.50.000'); END;
/