-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- SIU-GUARANI 3 -- Version 3.0.0 -- Function: f_escalas_de_notas_iguales(integer, integer) -- Verifica si dos escalas de notas tienen el mismo conjunto de notas (No verifica los resultados de las notas). -- -- Recibe: -- 1. Escala de notas 1 -- 2. Escala de notas 2 -- -- Retorna: 1 - Las escalas de notas son iguales / 0 - Las escalas de notas no son iguales -- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- DROP FUNCTION f_escalas_de_notas_iguales(integer, integer); CREATE OR REPLACE FUNCTION f_escalas_de_notas_iguales(_escala1 integer, _escala2 integer) RETURNS integer AS $BODY$ -- Variables locales DECLARE _cnt_notas1 smallint; DECLARE _cnt_notas2 smallint; DECLARE _rec_notas record; BEGIN IF _escala1 IS NULL OR _escala2 IS NULL THEN Return 0; END IF; IF _escala1 = _escala2 THEN -- Iguales ecalas de notas Return 1; END IF; -- Recupero la cantidad de notas de cada escala de notas. SELECT COUNT(*) INTO _cnt_notas1 FROM sga_escalas_notas_det WHERE escala_nota = _escala1; SELECT COUNT(*) INTO _cnt_notas2 FROM sga_escalas_notas_det WHERE escala_nota = _escala2; -- Diferente cantidad de notas. IF _cnt_notas1 <> _cnt_notas2 THEN RETURN 0; END IF; -- Igual cantidad de notas, verifico que sean las mismas. FOR _rec_notas IN (SELECT a.nota FROM sga_escalas_notas_det as a WHERE a.escala_nota = _escala1 UNION SELECT b.nota FROM sga_escalas_notas_det as b WHERE b.escala_nota = _escala2) EXCEPT (SELECT a.nota FROM sga_escalas_notas_det as a WHERE a.escala_nota = _escala1 INTERSECT SELECT b.nota FROM sga_escalas_notas_det as b WHERE b.escala_nota = _escala2) LOOP -- No son iguales. Si retorna registros la consulta, es porque encontro notas que no estan en la otra escala de notas. RETURN 0; END LOOP; -- Escalas de notas iguales! RETURN 1; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; -- ++++++++++++++++++++++++++++++ Fin Function f_escalas_de_notas_iguales(integer, integer) ++++++++++++++++ -- REVOKE EXECUTE ON FUNCTION f_escalas_de_notas_iguales (integer, integer) FROM public; GRANT EXECUTE ON FUNCTION f_escalas_de_notas_iguales(integer, integer) TO public; /* select * from f_escalas_de_notas_iguales(1,3); select * from f_escalas_de_notas_iguales(3,1); select * from f_escalas_de_notas_iguales(1,6); select * from f_escalas_de_notas_iguales(6,1); */